Questions tagged «sql-server»

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

2
检查是否存在EXISTS胜过COUNT个!……不?
我经常阅读何时必须检查行是否存在的情况,应该始终使用EXISTS而不是COUNT来完成。 但是,在最近的几种情况下,我测量了使用count时的性能提升。 模式如下: LEFT JOIN ( SELECT someID , COUNT(*) FROM someTable GROUP BY someID ) AS Alias ON ( Alias.someID = mainTable.ID ) 我不熟悉SQL Server内部“发生什么”的方法,因此我想知道EXISTS是否存在未预料到的缺陷,该缺陷对我所做的测量完全有意义(EXISTS是RBAR吗?!)。 您对此现象有一些解释吗? 编辑: 这是您可以运行的完整脚本: SET NOCOUNT ON SET STATISTICS IO OFF DECLARE @tmp1 TABLE ( ID INT UNIQUE ) DECLARE @tmp2 TABLE ( ID INT …

2
TOP如何(以及为什么)影响执行计划?
对于我要优化的中等复杂查询,我注意到删除该TOP n子句会更改执行计划。我可能已经猜到,当查询中包含TOP n数据库引擎时,该查询将忽略该TOP子句而运行,然后最后仅将结果集缩减为所请求的n行。图形化的执行计划似乎表明是这种情况,这是TOP“最后一步”。但似乎还有更多的事情正在进行。 我的问题是,TOP n子句如何(以及为什么)影响查询的执行计划? 这是我的情况的简化版本: 该查询匹配两个表A和B中的行。 如果没有该TOP子句,优化器估计表A将有19k行,表B将有46k行。对于A,返回的实际行数是16k,对于B,返回的行数是13k。散列匹配用于将两个结果集连接到a总共69行(然后应用排序)。这个查询很快发生。 当我添加TOP 1001优化器时,不使用哈希匹配;相反,它首先对表A的结果进行排序(相同的估计值/实际值为19k / 16k),并针对表B进行嵌套循环。表B的估计行数现在为1,奇怪的是,TOP n直接影响表B 针对B的估计执行次数(索引查找)-始终为2n + 1,在我的情况下为2003。如果我更改,则此估计值也会相应更改TOP n。当然,由于这是嵌套联接,因此实际执行次数为16k(表A中的行数),这会使查询速度变慢。 实际情况要复杂一些,但这捕获了基本思想/行为。使用索引查找来搜索两个表。这是SQL Server 2008 R2企业版。

4
表格定义中的列顺序重要吗?
定义表时,按目的对逻辑组中的列和组本身进行排序很有帮助。表中列的逻辑顺序将含义传达给开发人员,并且是一个良好样式的元素。 很清楚 但是,尚不清楚的是,表中列的逻辑顺序是否会对存储层的物理顺序有任何影响,或者是否有其他可能影响的影响。 除了对样式的影响之外,列顺序是否重要? 关于堆栈溢出有一个与此有关的问题,但是它缺乏权威性的答案。

2
如果EXISTS花费的时间比嵌入的select语句长
当我运行以下代码时,需要22.5分钟的时间,并且需要进行1.06亿次读取。但是,如果我自己仅运行内部select语句,则只需15秒即可完成264k次读取。附带说明,select查询不返回任何记录。 知道为什么IF EXISTS它会使它运行更长的时间并进行更多的读取吗?我也将select语句更改为do,SELECT TOP 1 [dlc].[id]并在2分钟后将其杀死。 作为临时解决方案,我将其更改为执行count(*)并将该值分配给变量@cnt。然后它做一个IF 0 <> @cnt声明。但是我认为EXISTS会更好,因为如果select语句中返回了记录,则一旦找到至少一条记录,它将停止执行扫描/查找,而count(*)将会完成整个查询。我想念什么? IF EXISTS (SELECT [dlc].[ID] FROM TableDLC [dlc] JOIN TableD [d] ON [d].[ID] = [dlc].[ID] JOIN TableC [c] ON [c].[ID] = [d].[ID2] WHERE [c].[Name] <> [dlc].[Name]) BEGIN <do something> END


4
我需要缩小数据库-我刚刚释放了很多空间
这里以各种形式提出了这个问题,但问题归结为: 我知道缩小数据库是有风险的。在这种情况下,我已经删除了太多数据,并且永远不会再使用它。 如何缩小数据库?我可以缩小哪些文件? 这样做时我应该考虑什么? 之后我应该做什么? 如果是大型数据库怎么办?我可以缩小一点吗?

1
我应该使用许多单字段索引而不是特定的多列索引吗?
这个问题是关于SQL Server索引技术的有效性的。我认为它被称为“索引交集”。 我正在使用一个存在许多性能和稳定性问题的现有SQL Server(2008)应用程序。开发人员对索引做了一些奇怪的事情。我无法获得有关这些问题的最终基准,也无法在互联网上找到任何非常好的文档。 表格上有许多可搜索的列。开发人员在可搜索列的每个EACH上创建了一个列索引。从理论上讲,SQL Server在大多数情况下将能够组合(相交)这些索引中的每一个以有效地访问表。这是一个简化的示例(实际表具有更多字段): CREATE TABLE [dbo].[FatTable]( [id] [bigint] IDENTITY(1,1) NOT NULL, [col1] [nchar](12) NOT NULL, [col2] [int] NOT NULL, [col3] [varchar](2000) NOT NULL, ... CREATE NONCLUSTERED INDEX [IndexCol1] ON [dbo].[FatTable] ( [col1] ASC ) CREATE NONCLUSTERED INDEX [IndexCol2] ON [dbo].[FatTable] ( [col2] ASC ) select * from …

1
在每个T-SQL语句之后执行
在每个SQL语句之后使用GO语句的背后原因是什么?我了解GO表示批处理已结束,并且/或者允许声明声誉,但是在每个声明之后使用它有什么优势。 我只是很好奇,因为很多Microsoft文档等都在每次声明后开始使用它,或者也许我刚刚开始注意到。 还有什么被认为是最佳实践?

1
如何阅读查询成本,它始终是百分比吗?
我目前正在学习SQL 70-433(Microsoft认证考试),并且对“查询成本”性能指标感到非常困惑。 根据我可以通过Google找到的任何文档,查询成本是一个百分比数字,代表整个批次中任何一部分所占的百分比。这对我来说似乎有些奇怪,因为我对特定查询的绝对优点感兴趣,而不是相对于碰巧出现在其中的其他查询的优点。 但是后来我想,也许您希望做的是并排放置两个替代查询,将它们作为“一批”运行,然后成本低于50%的任何一个成为赢家。 但是,第6章中关于查询成本的讨论是Microsoft的SQL 70-433培训工具包的一课,似乎与此没有任何关系。 这是一个示例:它们显示了一个包含两个相关子查询的查询,然后通过用OUTER APPLY替换子查询来对其进行改进。结果:“此查询的成本约为76,而第一个查询的成本是151的两倍。” 然后,他们进一步改善了查询,并将成本从76降低到3.6。它们并不暗示这些数字是百分比,而它们确实暗示它们是绝对值,与作为独立对象的查询有关,而没有引用任何其他查询。而且,无论如何,第一个查询的成本为151%? 在本章的后面,它们显示了一个执行计划的屏幕快照,该屏幕分为三个部分。第一个显示“成本:0%”,第二个显示“成本:1%”,最后一个显示“成本:99%”,但屏幕截图下方的(本书本身的)文本“此查询的成本为0.56” 。我猜他们意味着其他成本,但是我找不到其他地方的参考。 有人可以帮忙吗?我很困惑。
34 sql-server  ssms 

4
NOLOCK总是不好吗?
我是一个报表开发人员,想要使我的查询尽可能高效。我曾经和一个DBA一起工作,他告诉我-我相信是因为我一直在生产服务器上处理报表-可以NOLOCK在每个查询中使用。 现在,我与一个NOLOCK在任何情况下都被禁止使用的DBA一起工作-即使我的报告(由于在几个表上严重缺乏索引)正在停止复制和系统更新。我认为,在这种情况下,a NOLOCK将是一件好事。 由于我的大多数SQL培训都针对不同的DBA提出了截然不同的意见,因此我想向各种各样的DBA提出这一要求。

2
索引不能使执行速度更快,并且在某些情况下会降低查询速度。为什么会这样呢?
我正在尝试使用索引来加快处理速度,但是在进行联接的情况下,索引并不能改善查询的执行时间,在某些情况下,它会降低处理速度。 创建测试表并填充数据的查询为: CREATE TABLE [dbo].[IndexTestTable]( [id] [int] IDENTITY(1,1) PRIMARY KEY, [Name] [nvarchar](20) NULL, [val1] [bigint] NULL, [val2] [bigint] NULL) DECLARE @counter INT; SET @counter = 1; WHILE @counter < 500000 BEGIN INSERT INTO IndexTestTable ( -- id -- this column value is auto-generated NAME, val1, val2 ) VALUES ( 'Name' …
34 sql-server  index 

3
运行总数与计数?
如标题所示,我需要一些帮助来使T-SQL的运行状况更全面。问题是我需要做的总和是一个计数的总和: sum(count (distinct (customers))) 假设我只运行计数,结果将是: Day | CountCustomers ---------------------- 5/1 | 1 5/2 | 0 5/3 | 5 我需要输出的总和为: Day | RunningTotalCustomers ---------------------- 5/1 | 1 5/2 | 1 5/3 | 6 在使用该coalesce方法之前,我已经完成了总计操作,但从未进行过计数。现在我不知道该怎么做了。
34 sql-server  t-sql 

5
如何在SQL Server中正确处理TimeZone?
我的本地开发服务器在中东,但我的生产服务器在英国。 我需要向用户显示其所在时区的日期。例如,如果用户在沙特阿拉伯,那么我需要根据沙特阿拉伯格式显示时间。 是否应该创建一个名为TimeZone的新数据库表并将时间保存在UTC中?

1
SQL Server中的SLEEP_TASK等待类型-它表示什么?
我以前没有看过SLEEP_TASK等待类型,今天我似乎收到了很多。 我不是官方的DBA,而是知道某些DBA知识的SQL Server开发人员。上周末我们将服务器升级到10.52.2500.0-R2SP1。 我在网上可以找到的所有信息都表明SLEEP_TASK服务器正在等待某种内部过程完成。我没有任何阻塞或任何后台进程(如检查点或幽灵清理)运行,因此我有些困惑。 以前有没有人看过这种等待类型,如果可以的话,您能告诉我原因是什么吗?

2
使用XML阅读器优化计划
从此处执行查询以将死锁事件从默认扩展事件会话中拉出 SELECT CAST ( REPLACE ( REPLACE ( XEventData.XEvent.value ('(data/value)[1]', 'varchar(max)'), '<victim-list>', '<deadlock><victim-list>'), '<process-list>', '</victim-list><process-list>') AS XML) AS DeadlockGraph FROM (SELECT CAST (target_data AS XML) AS TargetData FROM sys.dm_xe_session_targets st JOIN sys.dm_xe_sessions s ON s.address = st.event_session_address WHERE [name] = 'system_health') AS Data CROSS APPLY TargetData.nodes ('//RingBufferTarget/event') AS XEventData (XEvent) …

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.