为什么在SQL执行计划中执行TOP操作


9

经过一会儿的搜索后,我决定发布此问题,因为它找不到答案,并向您道歉,如果那里没有类似的问题/答案。

在两个类似设置的SQL服务器上运行下面的查询时,我们会遇到不同的执行计划,这会影响性能,我们需要帮助找出原因。

查询:

SELECT process_id
INTO #temp
FROM revrep_revenue_fact
WHERE process_id = 284 
DROP TABLE #temp

服务器A的执行计划 服务器B

服务器B的执行计划 服务器B http://s2.postimg.org/z9fjrfv4n/server_B.png

您会注意到,服务器B在实际执行计划中具有TOP物理操作,我们正在尝试找出原因。两个查询在索引查找中使用相同的索引。

这是服务器A和服务器B的一些详细信息

服务器A和B都

Windows Server 2008 R2标准Service Pack 1

24GB RAM

64位操作系统

使用(SELECT SERVERPROPERTY('ProductVersion'))获得的SQL Server 2012版本

服务器A SQL版本11.0.3000.0

服务器B SQL版本11.0.5058.0

我们尝试过的

  1. 清除过程缓存
  2. 重建索引
  3. 刷新统计
  4. 设置行数0 与rowcount一起去

为什么服务器B在执行计划中有TOP?在这个简单的查询示例中,没有实际问题,但是在较大的查询中,TOP的成本增加了,我们发现性能受到了影响。我们将不胜感激调试任何帮助,我们将为您提供可能需要帮助的任何其他信息。


TOP运营商提出非零SET ROWCOUNT是连接上之前执行。执行之后,再试一次SET ROWCOUNT 0;。另外,您发布的SQL版本也不是SQL 2008 R2。SELECT SERVERPROPERTY('ProductVersion');在两台服务器上运行以获取实际的SQL Server版本。
丹·古兹曼

我使用提供的选择查询以sql版本更新了原始帖子。安装sql的服务器是Windows 2008 R2服务器,而安装的sql服务器是2012。按照先前另一个成员的建议,然后删除了该服务器,我们尝试将ROWCOUNT设置为0,而执行计划未更改。查看最新问题
Arthur Yegiazaryan 2015年

您可以GO在行数行后面加上a吗?您还可以发布Top运算符的属性吗?
罗布·法利

罗布(Rob)将GO和属性从顶部添加到原始帖子
亚瑟·叶吉扎良

Answers:


12

检查以确保两台服务器上的数据库兼容性级别相同。我在SQL Server 2012实例上进行了快速测试,并发现兼容性级别为100或更低时引入了TOP运算符。除非有特殊原因,否则最好在SQL Server 2012实例上使用110(SQL Server 2012)兼容性级别。


2

我认为您有ROWCOUNT的价值。做:

SET ROWCOUNT 0

...将其关闭。


1
SET ROWCOUNT 0并未将执行计划中的TOP删除
Arthur Yegiazaryan 2015年

1
@Arthur虽然这不是您所需要的解决方案,但这可能是将来读者采取这种行为的原因。(对不起,罗伯,我冒犯了删除您的帖子的自由,因为这确实可能是同一症状的问题。)
亚伦·伯特兰

亚伦,同意,并感谢您将其恢复。不是我的解决方案,但可能是其他人的解决方案。
Arthur Yegiazaryan 2015年
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.