缺失索引功能的限制

缺失索引功能具有下列限制:

  • 它不可用于微调索引配置。

  • 它不能收集 500 个以上缺失索引组的统计信息。

  • 它无法指定要在索引中使用的列的顺序。

  • 对于只涉及不等谓词的查询,它将返回不太准确的开销信息。

  • 它针对某些查询只报告包含列,因此必须手动选择索引键列。

  • 它只返回有关可能缺失索引的列的原始信息。

  • 它不会建议使用筛选索引。

  • 它可能会针对在 XML 显示计划中多次显示的同一缺失索引组返回不同的开销。

  • 它不会考虑不重要的查询计划。

下列各部分提供了有关这些限制的详细信息。

微调索引配置

缺失索引功能是一个用于查找缺失索引的轻量工具,它可以显著提高查询性能。它不提供足以微调索引配置的信息。若要实现此目的,请使用数据库引擎优化顾问。有关数据库引擎优化顾问的详细信息,请参阅优化物理数据库设计相关的查询优化功能

最大缺失索引组数

可以收集最多 500 个缺失索引组的相关统计信息。达到此阈值后,将不再收集其他缺失索引组数据。此阈值是不可优化的参数,不能进行更改。

索引列顺序

在建议索引时,缺失索引功能不考虑最佳的排序顺序。请参考以下示例查询:

SELECT column_a, column_b
FROM table_1
WHERE column_a < 10000
AND column_b < 10000
ORDER BY column_b, column_a

缺失索引功能可能建议一个索引并将 column_a 列在 column_b 的前面,但有利的排序顺序应为 column_bcolumn_a,因为这符合查询的排序顺序。当创建数据定义语言 (DDL) 语句以实现缺失索引时,可以通过检查各个工作负荷查询来选择最佳的排序顺序。有关根据从缺失索引功能接收的输出对 CREATE INDEX 语句中的列进行排序的详细信息,请参阅使用缺失索引信息编写 CREATE INDEX 语句

只涉及不等谓词的查询

对于只涉及不等谓词的查询,缺失索引功能使用一个简单模型生成开销信息。因此,对这些查询返回的开销信息可能不如对涉及相等谓词的查询返回的信息准确。请参考以下不包含相等谓词的示例查询:

SELECT *
FROM table_1
WHERE column_a > -1
AND column_b > -1

此示例查询只包含一个不等谓词 (WHERE column_a > -1 AND column_b > -1)。假定 table_1 中的所有行都符合谓词 column_a > -1 和 column_b > -1 的要求。在这种情况下,缺失索引功能可能会针对 column_acolumn_b 错误地建议索引。在这种情况下,由动态管理视图 sys.dm_db_missing_indexes_group_stats 报告的关联影响数目可能也不正确。

对某些查询只返回包含列

有时,此功能只报告包含列的列用法信息。例如,此功能可能会报告相等列 = { },不等列 = { },包含列 = {b, c, …}。在这种情况下,必须为索引键列选择包含列之一。使用为受益于某些相同列的其他查询返回的缺失索引信息,确定应该为索引键选择的包含列。

只返回原始信息

缺失索引功能可返回有关缺失索引的列的原始信息。这意味着使用返回的信息创建索引之前,可能需要先对该信息进行其他处理。

例如,如果涉及的列是一个计算列,并且该计算不确定或不精确,则针对该列的 CREATE INDEX 语句将失败。如果计算不精确,则只有首先将该列持久化,然后才能创建索引。

为 XML 显示计划中的同一缺失索引组返回不同的开销

缺失索引组可能会在 XML 显示计划中显示多次,并且每次显示缺失索引组时,都报告不同的开销。当单个查询的不同部分从同一缺失索引组获得不同收益时,可能会出现这种情况。

请参考以下示例查询:

SELECT i.CustomerID, c.ModifiedDate, City
FROM NewIndividual i JOIN NewCustomer c ON i.CustomerID = c.CustomerID
                    AND c.CustomerType = 'I'
          JOIN NewCustomerAddress ca ON ca.CustomerID = c.CustomerID
          JOIN NewAddress a ON a.AddressID = ca.AddressID
WHERE i.CustomerID = 16701

在此查询中,CustomerID 列上的两个不同的联接条件可能会生成两个完全相同的缺失索引组,这两个组对 NewIndividual.CustomerID 列包含相同的索引。在这种情况下,缺失索引组在 sys.dm_db_missing_index_groups 动态管理视图中只占一行。但是,缺失索引组将在 XML 显示计划输出中显示多次,并且对于不同的联接条件,具有不同的开销。