SELECT COUNT的奇怪表现(1)

时间:2013-09-18 12:28:25

标签: sql sql-server performance count

我有一个带有一些复杂连接和where条件的select查询,执行时需要大约9秒。

现在,奇怪的是如果我用select count(1)包装查询,执行时间会急剧增加。

SELECT COUNT(1) FROM 
(
    SELECT .... -- initial query, executes ~9s
) 
-- executes 1min

这对我来说很奇怪,因为我期望相反的结果 - sql-server引擎应该足够聪明以优化内部查询执行(例如,不要在select子句中执行嵌套查询,等等)。

这就是执行计划比较显示的内容!它表示它应该 74% 26%(前者是初始查询,后者用select count(1)包裹)。

但事实并非如此。

如果我应该发布查询本身,请发信息,因为它相当大(如果你需要它,那么请在评论中告诉我)。

告诉你!)

1 个答案:

答案 0 :(得分:1)

当您使用Java method A(){ Java method B(){} } 时,您不再需要所有列。

这意味着SQL Server可以使用较窄的索引来考虑不同的执行计划,这些索引不会覆盖原始查询的count(1)列表中使用的所有列。

一般情况下,这当然应该会导致更精简,更快速的执行计划,但在这种情况下看起来你运气不好而且它没有。

可能你会发现一个节点在实际和估计的行之间存在很大的差异 - 这种事情会在计划中传播,并可能导致其他子树的策略的次优选择(例如,次优连接排序或算法)