有没有办法查看查询优化器生成的候选执行计划是什么?

Ron*_*ldo 10 sql-server optimization

查询优化器创建多个可能的执行计划。如何查看在选择执行的计划之前生成的所有计划?

微软说

查询优化器必须分析可能的计划并选择估计成本最低的计划。

请注意,我不是在谈论执行计划缓存和重用,我在谈论候选执行计划,即生成但未选择执行的执行计划。

根据 Benjamin Nevarez 的文章SQL Server 查询优化器

候选执行计划的生成在查询优化器内部使用转换规则执行,启发式的使用限制了考虑的选择数量,以保持优化时间合理。候选计划在优化期间存储在内存中,称为备忘录的组件中。

是否有可能以显示实际执行计划的方式呈现候选计划?

Con*_*SFT 14

如果优化器认为它们比迄今为止在搜索中看到的当前最佳解决方案更差,则优化器可以通过在完全探索之前丢弃计划和部分计划来减少搜索时间。因此,它实际上并没有完全生成所有的替代方案。此外,XML 表示实际上是在搜索结束时生成的东西 - 内部表示有些不同。不幸的是,目前没有可供您探索同一查询的其他可能计划的公共功能。使用调试器,我们可以查看在优化过程中保存所有这些内容的结构。它被称为备忘录。您可以在此处阅读有关 SQL 优化器所基于的 Cascades 框架的更多信息


Jos*_*ell 13

据我所知,没有办法查看最终被丢弃的候选计划的图形/XML 执行计划。如果您期望某种计划形状,一种方法是使用提示,然后比较成本,以了解为什么选择最终计划而不是提示计划。

例如,您可能期望某个非聚集索引将用于查询的一部分,但最终计划改为扫描聚集索引。向WITH (INDEX (IX_Your_Index))查询添加表提示可以向您展示该索引的结果。有很多提示可用于此目的。不过,您可以看到很多带有提示索引和连接的选项。

撇开完整的执行计划不谈,有一些方法可以查看有关优化过程、优化器如何转换查询以及考虑和选择或丢弃的不同计划片段的更多详细信息。Paul White 的Query Optimizer Deep Dive系列详细介绍了这一点。

如果您想可视化如何转换和简化查询的“逻辑树”(如 Paul 系列的第 1 部分所述),有一个简洁的免费工具:SQL Server 查询树查看器

本系列的第 3 部分讨论“中间”计划以及如何通过优化器的备忘录数据结构查看有关它们的一些信息。

我知道这些都不是特别简单,但希望它有助于您理解为什么有些计划可能会被其他计划丢弃!无论如何,我发现上面链接的所有文章都很有趣