我用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是否可以被视为覆盖索引?
还是必须满足所有列的要求? 我们需要为所有三列创建一个非聚集索引以作为覆盖索引吗?
答案 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
这也将有助于加入(例如,从客户到订单)。