我有一个带有一些复杂连接和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)
包裹)。
但事实并非如此。
如果我应该发布查询本身,请发信息,因为它相当大(如果你需要它,那么请在评论中告诉我)。
告诉你!)
答案 0 :(得分:1)
当您使用Java method A(){
Java method B(){}
}
时,您不再需要所有列。
这意味着SQL Server可以使用较窄的索引来考虑不同的执行计划,这些索引不会覆盖原始查询的count(1)
列表中使用的所有列。
一般情况下,这当然应该会导致更精简,更快速的执行计划,但在这种情况下看起来你运气不好而且它没有。
可能你会发现一个节点在实际和估计的行之间存在很大的差异 - 这种事情会在计划中传播,并可能导致其他子树的策略的次优选择(例如,次优连接排序或算法)