【问题标题】:Directly evaluate subquery in SQL Server在 SQL Server 中直接评估子查询
【发布时间】: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


【解决方案1】:

解决了。解决方案是使用连接提示,强制在将内部查询连接到更大的表之前对其进行评估。

inner REMOTE join dbo.poAudit...等

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多