Ada*_*ish 24 sql-server optimization performance query-optimization sql-server-2008
我正在重复Mongus Pong提出的问题 为什么使用临时表比嵌套查询更快?没有一个适合我的答案.
我们大多数人在某些时候发现,当嵌套查询达到某种复杂性时,需要将其分解为临时表以保持其性能.这是荒谬的,这可能永远是最实用的方式向前意味着这些过程不能再被制作成图.通常第三方BI应用程序只能很好地与视图一起使用,因此这是至关重要的.
我确信必须有一个简单的查询计划设置,使引擎只是依次为每个子查询假脱机,从内到外工作.没有第二个猜测它如何使子查询更具选择性(它有时非常成功)并且没有相关子查询的可能性.只是程序员打算通过括号之间的自包含代码返回的数据堆栈.
我常常发现,简单地从子查询更改为#table需要花费120秒到5秒的时间.本质上,优化器在某个地方犯了一个重大错误.当然,可能有非常耗时的方式我可以诱使优化器以正确的顺序查看表,但即使这样也无法保证.我不是要求理想的2秒执行时间,只是temp tabling在视图灵活性范围内提供的速度.
我以前从未在这里发帖,但我已经写了多年的SQL,并且已经阅读了其他有经验的人的评论,他们也刚刚接受了这个问题,现在我只想让合适的天才前进并说出来特别提示是X ...
Mar*_*ith 12
有一些可能的解释,为什么你看到这种行为.一些常见的是
#temp表中可以通过从等式中移除一些可能的选项来强制计划的该部分的更优化的连接顺序.#temp表中可以通过校正差的基数估计来改进计划的其余部分.最可靠的方法就是使用#temp表格并自己实现.
关于第1点的失败请参阅提供强制以强制CTE或派生表的中间实现.使用TOP(large_number) ... ORDER BY可以经常鼓励结果被假脱机而不是重复评估.
即使它有效,但是没有关于线轴的统计数据.
对于第2点和第3点,您需要分析为什么没有得到所需的计划.可能重写查询以使用sargable谓词,或更新统计信息可能会获得更好的计划.如果失败,您可以尝试使用查询提示来获得所需的计划.
我不相信有一个查询提示指示引擎依次假脱机每个子查询.
有一个OPTION (FORCE ORDER)查询提示强制引擎按指定的顺序执行JOIN,这可能会诱使它在某些情况下实现该结果.此提示有时会导致复杂查询的更有效计划,并且引擎始终坚持次优计划.当然,通常应该信任优化器以确定最佳计划.
理想情况下会有一个查询提示,允许您将CTE或子查询指定为"物化"或"匿名临时表",但事实并非如此.
| 归档时间: |
|
| 查看次数: |
8308 次 |
| 最近记录: |