查询调整以满足超时设置

Dev*_*ian 4 performance sql-server-2005 sql-server query-performance

我们有一个在搜索屏幕上有 30 秒超时的网络应用程序。我已经分析了原始查询并为查询的 9 个连接之一添加了一个缺失的索引。其他诸如预期行数和实际行数之类的东西都很好。没有表或索引扫描。但它仍然没有在 30 秒内出现。它很接近。

我通过使用临时表分解成更小的步骤来重写查询,并且每步骤不超过 2 个连接。它现在在5秒内尖叫。都好。

我的具体问题是这是解决此类问题的正常/常见方法吗?为什么我要以这种方式帮助优化器?

Pau*_*ite 7

这是解决此类问题的正常/常见方法吗?

是的,这是一种常见的方法(尽管可能不够普遍)。

为什么我要以这种方式帮助优化器?

主要是因为优化器是基于成本的,并且依赖于基数估计(预期行数)作为该计算的主要输入。

假设有正确的统计数据可用,并且它们是最新的,对基础关系的估计可能非常准确。这些导出的估计是下一个操作(例如,连接)的输入,它产生另一个基数估计作为其输出,依此类推。这个过程(和统计输入)的性质意味着随着推导继续向上,估计的准确性将趋于降低。糟糕的估计会导致基于成本的选择不佳,以及其他副作用,例如哈希或排序操作的内存预留不足。

物化中间结果(使用临时表或其他方法)为优化器提供了一个新的起点,可能会自动建立在物化数据上的新统计信息,甚至可能还有有用的索引。这些考虑意味着更简单的查询(使用具有准确估计逻辑的操作)往往会产生更高质量的执行计划。