Ron*_*ldo 10 sql-server optimization
查询优化器创建多个可能的执行计划。如何查看在选择执行的计划之前生成的所有计划?
微软说:
查询优化器必须分析可能的计划并选择估计成本最低的计划。
请注意,我不是在谈论执行计划缓存和重用,我在谈论候选执行计划,即生成但未选择执行的执行计划。
根据 Benjamin Nevarez 的文章SQL Server 查询优化器:
候选执行计划的生成在查询优化器内部使用转换规则执行,启发式的使用限制了考虑的选择数量,以保持优化时间合理。候选计划在优化期间存储在内存中,称为备忘录的组件中。
是否有可能以显示实际执行计划的方式呈现候选计划?
Jos*_*ell 13
据我所知,没有办法查看最终被丢弃的候选计划的图形/XML 执行计划。如果您期望某种计划形状,一种方法是使用提示,然后比较成本,以了解为什么选择最终计划而不是提示计划。
例如,您可能期望某个非聚集索引将用于查询的一部分,但最终计划改为扫描聚集索引。向WITH (INDEX (IX_Your_Index))
查询添加表提示可以向您展示该索引的结果。有很多提示可用于此目的。不过,您可以看到很多带有提示索引和连接的选项。
撇开完整的执行计划不谈,有一些方法可以查看有关优化过程、优化器如何转换查询以及考虑和选择或丢弃的不同计划片段的更多详细信息。Paul White 的Query Optimizer Deep Dive系列详细介绍了这一点。
如果您想可视化如何转换和简化查询的“逻辑树”(如 Paul 系列的第 1 部分所述),有一个简洁的免费工具:SQL Server 查询树查看器
本系列的第 3 部分讨论“中间”计划以及如何通过优化器的备忘录数据结构查看有关它们的一些信息。
我知道这些都不是特别简单,但希望它有助于您理解为什么有些计划可能会被其他计划丢弃!无论如何,我发现上面链接的所有文章都很有趣