Mag*_*ier 2 sql-server statistics execution-plan sql-server-2008-r2
在运行Ola 的 IndexOptimize重建所有索引和统计信息后,我立即清除了数据和计划缓存,并运行了一个非常复杂的丑陋查询来获得其性能的基线。查询实际计划显示 ReasonForEarlyTermination=Timeout 和 Est Rows 和 Actual Rows 的偏差(与 est. 相比,实际行因子为 10,000)。
我想知道这种行数的不平衡是否可能是超时的结果 - 我认为在索引和统计信息重建之后应该是合适的?
如果无法更改查询本身,那么优化以 ReasonForEarlyTermination=Timeout 结尾的查询是否有意义?由于我打算做一些索引调整并重新运行查询,所以不是不可能确定可能改进的结果,因为下一个查询计划创建肯定会再次超时,因此可能会有所不同,结果不同?
技术 详细信息:Sql Server 2008 R2 开发。埃德。10.50.6000.34 DB Comp. 80级。
Pau*_*ite 10
我想知道这种行数不平衡是否可能是超时的结果
几乎无一例外,没有。在优化开始之前执行初始基数估计。随后的优化器转换可能需要计算新的估计值。没有一般规则可以说明哪个估计更“准确”。
有关超时原因的其他信息,请参阅此相关问题:
我认为在索引和统计信息重建后应该是合适的?
您有“一个非常复杂的丑陋查询”。在这种情况下期望基数估计器能很好地工作是不合理的。尝试根据单列(可能是采样的)统计直方图和单值密度信息计算自己的估计值,以了解这一点。
随着查询复杂性的增加,估计的质量往往会下降。这是不可避免的,如果您认为一个估计的输入通常是另一个估计的输出。因此,错误趋于累积。使用“丑陋”(阅读:非关系或其他难以估计的)条件使情况变得更糟。
如果无法更改查询本身,那么优化以 ReasonForEarlyTermination=Timeout 结尾的查询是否有意义?
当然(但与任何其他有问题的计划没有什么不同)。在一般的,可以中断查询时,使用不同的语法,或者一百个不同的“招数”任何一个表达它可以使用。
即使查询本身无法更改,如果可以找到一个好的计划,也可以通过计划指南强制执行。更一般地说,添加新的统计信息和/或索引可以为优化器和基数估计器提供更好的信息。这也会以复杂的方式影响通过优化器的代码路径。我不会尝试列出在更改查询文本之外可以完成的所有事情。
...下一个查询计划创建肯定会再次超时,因此可能会有所不同,结果不同?
关键是通过提供更好的信息或数据访问方法,您通常会提高获得好的计划的机会。优化器不是随机的,因此对于数据库的给定状态,无论超时或其他终止原因如何,都会选择相同的计划。
当然,成功的真正关键是避免“非常复杂、丑陋”的查询。