如何将非聚集索引变成覆盖索引

时间:2019-06-19 08:10:02

标签: sql-server database indexing non-clustered-index

我用Google搜索覆盖率索引,发现:

“覆盖索引是复合索引的一种特殊类型,其中所有列都存在于索引中。”

我了解主要目的是使非聚集索引不查找聚集索引,对于SQL Server,我们可以在创建索引时使用“ INCLUDE”列,因此SQL Server会在索引的叶级别添加它们指数。因此,无需通过cluster-index查找。

但是,我们有一个Customer表(CustID,FirstName,City),该表在CustID上具有聚集索引。

如果我们在FirstName列上创建非聚集索引(称为IX_FIRSTNAME),并将该列作为有效负载包括在索引的叶节点中,并查询为:

select FirstName from Customers where FirstName Like 'T*';

因此在这种情况下,无需通过聚簇索引进行查找,那么IX_FIRSTNAME是否可以被视为覆盖索引?

还是必须满足所有列的要求? 我们需要为所有三列创建一个非聚集索引以作为覆盖索引吗?

1 个答案:

答案 0 :(得分:1)

这里有两个概念:

  • 聚集索引与非聚集索引
  • 发现索引

覆盖索引是可以满足查询中的where子句的索引。由于您可能对数据运行多个查询,因此给定索引可能会“覆盖”一个查询,而不是另一个。

在您的示例中,IX_FIRSTNAME是查询的覆盖索引

select FirstName from Customers where FirstName Like 'T*';

但不适用于查询

select FirstName from Customers where FirstName Like 'T*' and City Like 'London';

许多性能优化归结为“理解您的查询,尤其是where子句,并设计涵盖索引的内容”。为每种可能的列组合创建索引不是一个好主意,因为索引确实有其自己的性能成本。

第二个概念是“聚集”索引与“非聚集”索引。这更多是物理上的问题-使用聚簇索引时,数据按索引顺序存储在磁盘上。这非常适合在表的主键上创建索引(如果主键是递增整数)。在您的示例中,您将在custid上创建聚集索引,该索引将涵盖以下查询:

select FirstName from Customers where custid = 12

这也将有助于加入(例如,从客户到订单)。