【发布时间】:2012-05-18 07:56:05
【问题描述】:
我有一个相当复杂的 SQL 查询,涉及多个子查询和联合。尽管很复杂,但子查询部分执行得非常快(编译后
我已经使用“set statistics time on”和“set statistics io on”来跟踪对基表的访问,并且 SQL 执行的逻辑读取次数超出了必要的范围。当我自己运行子查询时,它只读取了 10 次左右,但运行整个查询时大约是 1800 次。
我想鼓励 SQL 首先评估子查询 - 预期的行数是 1-5,因此数据集很小。然后它应该被内部连接到同一个基表,并拉回大约 10-20 条记录。
有没有办法使用提示来确保 SQL 针对预期情况进行优化?查询逻辑对于优化器来说似乎太多了,它选择的执行计划仅适用于比我的情况大得多的行集。
编辑:最终连接中的条件之一将过滤掉基表中 99.99% 的行。如果我可以强制 SQL 首先评估它,它应该可以解决问题。有没有办法做到这一点?
此处查询文字:http://pastebin.com/zVR91AP2
在注释掉末尾的 WHERE 子句后,查询返回 4 行并在
【问题讨论】:
-
您的统计数据是最新的吗?
-
没有代码帮不了你...
-
您可能希望将您的解释计划添加到问题中。
-
您需要先执行子查询,将结果存储到例如表变量,然后在您的完整查询中使用该表变量。相关子查询的重复执行是众所周知的“性能”杀手
-
当询问如何优化查询时,它确实有助于显示查询(至少)。
标签: sql sql-server sql-server-2005 optimization