Dev*_*ian 4 performance sql-server-2005 sql-server query-performance
我们有一个在搜索屏幕上有 30 秒超时的网络应用程序。我已经分析了原始查询并为查询的 9 个连接之一添加了一个缺失的索引。其他诸如预期行数和实际行数之类的东西都很好。没有表或索引扫描。但它仍然没有在 30 秒内出现。它很接近。
我通过使用临时表分解成更小的步骤来重写查询,并且每步骤不超过 2 个连接。它现在在5秒内尖叫。都好。
我的具体问题是这是解决此类问题的正常/常见方法吗?为什么我要以这种方式帮助优化器?
这是解决此类问题的正常/常见方法吗?
是的,这是一种常见的方法(尽管可能不够普遍)。
为什么我要以这种方式帮助优化器?
主要是因为优化器是基于成本的,并且依赖于基数估计(预期行数)作为该计算的主要输入。
假设有正确的统计数据可用,并且它们是最新的,对基础关系的估计可能非常准确。这些导出的估计是下一个操作(例如,连接)的输入,它产生另一个基数估计作为其输出,依此类推。这个过程(和统计输入)的性质意味着随着推导继续向上,估计的准确性将趋于降低。糟糕的估计会导致基于成本的选择不佳,以及其他副作用,例如哈希或排序操作的内存预留不足。
物化中间结果(使用临时表或其他方法)为优化器提供了一个新的起点,可能会自动建立在物化数据上的新统计信息,甚至可能还有有用的索引。这些考虑意味着更简单的查询(使用具有准确估计逻辑的操作)往往会产生更高质量的执行计划。
归档时间: |
|
查看次数: |
643 次 |
最近记录: |