Questions tagged «sql-server»

所有版本的Microsoft SQL Server(非MySQL)。还请添加特定于版本的标记,例如sql-server-2016,因为它通常与问题相关。

3
当我向其中添加WHERE子句时,是否优化了视图?
如果在视图内部或外部过滤视图,这会有所不同吗? 例如,这两个查询之间有什么区别吗? SELECT Id FROM MyTable WHERE SomeColumn = 1 要么 SELECT Id FROM MyView WHERE SomeColumn = 1 并且MyView定义为 SELECT Id, SomeColumn FROM MyTable 如果源表位于链接服务器上,答案是否有所不同? 我之所以问是因为我必须从链接的服务器查询一个大表(4400万行)两次,并获得结果的汇总。我想知道是否应该创建两个视图来访问数据,每个查询一个视图,还是我可以放弃一个视图和一个WHERE子句。

5
如何运行带有许多插入的大型脚本而又不会耗尽内存?
题: 我有一个从select语句中插入约4.5万个脚本的脚本。当我尝试运行它时,收到一条错误消息,指出我的内存不足。如何使该脚本运行? 内容: 添加了一些新的数据字段,以使一个应用程序可以与客户端使用的另一个应用程序完美兼容。 从客户端获取了一个包含所有数据的电子表格,这些数据将当前数据项映射到这些新字段的值。 将电子表格转换为插入语句。 如果我仅运行某些语句,则它可以工作,但整个脚本却不能。 不,没有错别字。 如果有其他方法,我应该加载此数据,请随时批评我并告知我。

3
高效插入具有聚簇索引的表
我有一条SQL语句,将行插入到表中,该表在TRACKING_NUMBER列上具有聚簇索引。 例如: INSERT INTO TABL_NAME (TRACKING_NUMBER, COLB, COLC) SELECT TRACKING_NUMBER, COL_B, COL_C FROM STAGING_TABLE 我的问题是-在SELECT语句中为聚集索引列使用ORDER BY子句是否有帮助,或者ORDER BY子句所需的额外排序会否抵消获得的任何收益?

4
在生产中的数据库上使用SQL Profiler
作为开发人员,我经常使用SQL Profiler。这是一个很好的调试工具,既可以跟踪我的代码在做什么,也可以分析性能问题。 但是我一直在我的开发环境中使用它,并且使用的方式非常受控。 启动我的应用程序,并使其进入特定状态 在探查器上开始跟踪 对我的应用程序执行特定的操作序列 停止跟踪并检查结果。 SQL Profiler可以在生产环境中实际使用吗? 我首先关心的是它将降低性能。 我的第二个担心是,因为它正在生产中,所以您不会触发有趣的动作本身。您将不得不长时间运行分析器,然后分析结果。结果集会变得太笨拙吗?(占用太多的磁盘空间,很难查询)。 有人在生产中使用SQL事件探查器吗?


2
为什么我们需要在SQL Server中重建和重新组织索引
搜索互联网后,我找不到原因 为什么我们需要在SQL Server中重建和重新组织索引? 当我们重建和重组时,内部会发生什么? 网站上的一篇文章说: 当索引碎片大于40%时,应重建索引。当索引碎片在10%到40%之间时,应该重新组织索引。索引重建过程使用更多的CPU,并锁定数据库资源。SQL Server开发版本和企业版具有选项“联机”,可以在重建索引时将其打开。联机选项将在重建期间保持索引可用。 我不明白这一点,尽管它说WHEN要这样做,但是我想知道WHY我们是否需要重建和重组索引?



6
查询以报告磁盘空间分配和已用空间
对于一个应用程序,我们总共使用6个数据库,并且在所有6个自动增长的数据库中(通过SAN存储)我们只能共享4TB的空间。 我想为单个数据库写一个查询(报告),以指示SQL Server Management Studio中“任务”>“收缩”>“数据库”选项下的“当前分配的空间”和“可用的可用空间”属性。 然后,我想将这些数字转换为TB并汇总每个数据库,以大致估算出我们还剩下多少空间。可以通过T-SQL查询访问这些字段吗?如果是这样,查询将是什么样?

4
检查SQL Server数据库中是否存在用户
我正在使用SQL Server2012。我想在将用户添加到数据库之前检查用户是否存在。 这是我测试过的: USE [MyDatabase] GO IF NOT EXISTS (SELECT name FROM [sys].[server_principals] WHERE name = N'IIS APPPOOL\MyWebApi AppPool') Begin CREATE USER [IIS APPPOOL\MyWebApi AppPool] FOR LOGIN [IIS APPPOOL\MyWebApi AppPool] WITH DEFAULT_SCHEMA=[dbo] end ALTER ROLE [db_owner] ADD MEMBER [IIS APPPOOL\MyWebApi AppPool] GO 但是,SELECT name FROM [sys].[server_principals]如果该用户存在于中,则此代码不会返回MyDatabase。 如何检查用户是否存在MyDatabase?

3
RANK()和DENSE_RANK()是确定性的还是不确定性的?
根据官方Microsoft BOL DENSE_RANK是不确定的(RANK())。但是根据Itzik Ben-Gan的排名函数, “ ... RANK()和DENSE_RANK()函数始终是确定性的”。谁是对的? 到目前为止,我发现的是: Microsoft的定义 “确定性函数在每次使用一组特定的输入值并被赋予相同的数据库状态时,总是返回相同的结果。” 所以在理论表中,员工 Employee Salary Sue Right 1.00 Robin Page 1.00 Phil Factor 1.00 和员工2 Employee Salary Phil Factor 1.00 Sue Right 1.00 Robin Page 1.00 是相同的。但是排名函数返回不同的值: CREATE TABLE [dbo].[Employees]( --[ID] [int] IDENTITY(1,1) NOT NULL, [Employee] [varchar](150) NOT NULL, [Salary] [smallmoney] NULL, …
27 sql-server 


2
插入大量行的最快方法是什么?
我有一个数据库,在其中我将文件加载到临时表中,从该临时表中我有1-2个连接来解析一些外键,然后将这些行插入到最终表中(每月有一个分区)。我有大约34亿行用于三个月的数据。 使这些行暂存到最终表中的最快方法是什么?SSIS数据流任务(使用视图作为源并激活快速加载)或插入INTO SELECT ....命令?我尝试了“数据流任务”,并在5个小时内可以得到大约10亿行(8核/服务器上192 GB RAM),这对我来说感觉很慢。

1
为什么查询导致溢出到tempdb?
背景 我正在将160gb数据库从具有48gb RAM的Win 2008服务器上的MSSQL 2008(标准)迁移到具有64gb RAM的Win 2012上运行MSSQL 2012(64位网络版)的新服务器上。旧服务器处于活动状态并处于负载状态;新服务器未投入生产。新服务器具有8个tempdb文件(每个4GB)。 问题 在新服务器上进行测试时,我看到许多查询中的步骤引起警报,提示“操作员在执行过程中使用tempdb溢出数据”。我已经能够通过重写一些查询来避免排序,但这并不能真正解决问题。旧服务器上的相同查询不会引起溢出。我读过,当MSSQL无法完成内存中的操作并不得不溢出/分页到tempdb中时,就会发生溢出。我应该担心泄漏吗? 例子 我已经在数据库上运行了sp_updatestats,因此统计信息应该是最新的,但是您会注意到估计的行数与实际的行数之间存在一些差异。 内存问题 我已为64GB的MSSQL设置了最大内存设置。当前,MSSQL已消耗了大约35gb的内存,但是工作集只有682mb。旧服务器(尽管在生产中,正在处理负载)具有44gb的内存分配给MSSQL,其中43.5gb在其工作集中。 我不知道泄漏是否与记忆设置有关-任何人有任何想法吗?MSSQL当前有英亩的可用内存,那么为什么它会因某种排序和散列匹配而溢出到tempdb中?

4
为什么在相同计划中,(相同)1000个唯一索引的估计成本不同?
在下面的查询中,两个执行计划都估计将对唯一索引执行1,000次查找。 搜索是由对同一源表的有序扫描驱动的,因此看起来应该最终以相同的顺序搜索相同的值。 两个嵌套循环都有 <NestedLoops Optimized="false" WithOrderedPrefetch="true"> 有人知道为什么第一个计划的成本为0.172434,而第二个计划的成本为3.01702吗? (问题的原因是,由于明显降低了计划成本,因此向我建议了第一个查询,这是一种优化。实际上,我认为它似乎在做更多的工作,但我只是想解释这个差异。) ) 设定 CREATE TABLE dbo.Target(KeyCol int PRIMARY KEY, OtherCol char(32) NOT NULL); CREATE TABLE dbo.Staging(KeyCol int PRIMARY KEY, OtherCol char(32) NOT NULL); INSERT INTO dbo.Target SELECT TOP (1000000) ROW_NUMBER() OVER (ORDER BY @@SPID), LEFT(NEWID(),32) FROM master..spt_values v1, master..spt_values v2; INSERT INTO dbo.Staging …

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.