超出内存限制
由于内存压力,优化器被迫停止寻找更好的计划替代方案。应对此原因进行调查和更正,然后再次尝试查询编译。如果不存在内存不足的情况,返回的计划很可能不是优化程序会选择的计划。
超时
这个原因被很多人误解了。
查询优化器旨在快速找到合理的计划。它不会进行详尽的搜索以找到最佳的计划。通过设计,它避免在优化上花费不必要的更多时间。确保超时的这些功能之一就是“超时”(不是时间的度量)。
优化器根据逻辑查询的复杂性,基数估计以及到目前为止找到的最便宜的计划(如果有)的估计成本,为自己设置一个“探索预算”。具有更高基数的更复杂查询将获得更高预算。
如果在其搜索阶段之一中超出此预算,则该阶段结束。这是优化器设计和正常操作的一部分。需要更多优化器工作的查询就可以了;那些不,不要。
将“超时”视为“找到足够好的计划”。
找到足够好的计划
这与空白原因完全相同。成本低于0.909090 ...(1 / 1.1)的计划以这种方式标记只是一个历史怪癖。当出现此原因时,一切不会尽早停止或在优化程序代码中进行特殊处理或有所不同。
除了“超出内存限制”之外,“提前终止的原因”对于查询调整或性能分析都没有多大意义(如果有的话)。我通常会忽略它们。
忠告
根据实际性能指标(经过的时间,CPU /内存使用情况……在上下文中重要的内容)来确定查询调整工作的目标。如果查询对于其预期目的而言太慢,请花一些时间使其加快速度。测量实际性能,将其与基线和历史记录进行比较,并针对重要差异调整目标。
将具有保证的干净数据存储在适当的关系模式中,其中包含有用的统计信息和索引以及编写良好的优化程序友好查询。