关于缺失索引功能

缺失索引功能使用动态管理对象和显示计划,提供有关可增强 SQL Server 查询性能的缺失索引的信息。

组件

当查询优化器生成查询计划时,它将分析什么是用于特定筛选条件的最佳索引。如果不存在最佳索引,则查询优化器将生成非最佳查询计划,但仍会存储有关这些索引的信息。使用缺失索引功能,您可以访问有关这些索引的信息以决定是否实现它们。

缺失索引功能包含下列组件:

  • 一组动态管理对象,可对其进行查询以返回有关缺失索引的信息。

  • XML 显示计划中的 MissingIndexes 元素,它将查询优化器认为缺失的索引与索引缺失的查询相关联。

缺失索引功能组件将在下列部分中进行详细探讨。

动态管理对象

在 SQL Server 上运行标准的工作负荷后,通过查询下表中列出的动态管理对象可检索到有关缺失索引的信息。这些动态管理对象存储在 master 数据库中。

动态管理对象

返回的信息

sys.dm_db_missing_index_group_stats

返回有关缺失索引组的摘要信息,例如,通过实现特定的缺失索引组所获取的性能改善。

sys.dm_db_missing_index_groups

返回有关特定缺失索引组的信息,例如组标识符和该组包含的所有缺失索引的标识符。

sys.dm_db_missing_index_details

返回有关缺失索引的详细信息,例如,返回缺失索引的表的名称和标识符,以及应组成缺失索引的列和列类型。

sys.dm_db_missing_index_columns (Transact-SQL)

返回有关缺失索引的数据库表列的信息。

您可以使用这些动态管理对象返回的信息以及使用此信息的工具或脚本,生成将实现缺失索引的 CREATE INDEX DDL 语句。

事务一致性

对这些动态管理对象中的行所做的单独修改在事务上是不一致的。也就是,如果中止查询或回滚封闭的事务,则包含有关此查询缺失索引信息的行仍然存在。

仅支持整个事务。不支持检查点和部分回滚。

注意注意

当表的元数据发生更改时,有关此表的所有缺失索引信息都将从这些动态管理对象中删除。例如,当在表中添加列或删除列,或为表列创建索引时,表的元数据都会发生更改。

XML 显示计划的 MissingIndexes 元素

若要将查询与动态管理对象结果中标识的缺失索引相关联,可查看 XML 显示计划中的 MissingIndexes 元素。下面的示例阐释了 MissingIndexes 元素:

<ShowPlanXML…>

 <BatchSequence>

  <Batch>

   <Statements>

    <StmtSimple…>

     <StatementSetOptions… />

      <QueryPlan…>

        <MissingIndexes>

        <MissingIndexGroup Impact="22.8764">

         <MissingIndex Database="[ADVENTUREWORKS2008R2]" Schema="[Person]" Table="[Address]">

          <ColumnGroup Usage="EQUALITY">

           <Column Name="[PostalCode]" ColumnId="4" />

          </ColumnGroup>

          <ColumnGroup Usage="INEQUALITY">

           <Column Name="[ModifiedDate]" ColumnId="5" />

          </ColumnGroup>

          <ColumnGroup Usage="INCLUDE">

           <Column Name="[AddressLine1]" ColumnId="2" />

           <Column Name="[AddressLine2]" ColumnId="3" />

           <Column Name="[StateProvinceID]" ColumnId="1" />

          </ColumnGroup>

         </MissingIndex>

        </MissingIndexGroup>

       </MissingIndexes>

MissingIndexes 元素包含的信息有助于确定哪一种索引会提高 StmtSimple 元素中描述的特定查询的性能,哪一种索引自身包含 Transact-SQL 语句。然后,可使用针对此元素返回的信息编写 CREATE INDEX DDL 语句。

启用和禁用缺失索引功能

默认情况下,缺失索引功能处于启用状态。没有提供任何控件来打开或关闭此功能,也没有提供任何控件来重置查询动态管理对象时返回的任何表。重新启动 SQL Server 时,将删除所有缺失索引信息。

只有将 -x 参数用于 sqlservr 命令提示实用工具启动 SQL Server 实例时,才能禁用此功能。有关详细信息,请参阅 sqlservr 应用程序