1

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

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

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

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

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

但事实并非如此。

如果我应该发布查询本身,我不知道,因为它相当大(如果您需要它,请在评论中告诉我)。

谢谢你!)

4

1 回答 1

1

当您使用时,count(1)您不再需要所有列。

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

通常,这当然应该导致更精简、更快的执行计划,但是在这种情况下,您似乎很不走运,但事实并非如此。

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

于 2015-08-23T18:05:24.970 回答