您能解释一下 Microsoft SQL Server 中的覆盖索引和覆盖查询的概念以及它们之间的关系吗?

有帮助吗?

解决方案

覆盖索引可以满足查询中所有请求的列,而无需进一步查找聚簇索引。

没有覆盖查询这样的东西。

看看这篇Simple-Talk文章:使用覆盖索引来提高查询性能

其他提示

如果 所有列 要求在 select 查询列表是 可以在索引中找到, ,那么查询引擎就不必再次查找表,这可以显着提高查询的性能。由于索引中提供了所有请求的列,因此索引覆盖了查询。因此,该查询称为覆盖查询,索引为覆盖索引。

如果选择列表中的列来自同一个表,则聚集索引始终可以覆盖查询。

如果您不熟悉索引概念,以下链接可能会有所帮助:

覆盖索引是 Non-Clustered 索引。 Clustered和Non-Clustered索引都使用B-Tree数据结构来改进对数据的搜索,不同之处在于,在Clustered Index的叶子中,整个记录(即行)在物理上存储在那里!,但这不是非聚集索引的情况。以下示例说明了这一点:

示例:我有一个包含三列的表:ID,Fname和Lname。

但是,对于非聚集索引,有两种可能性:表已经具有聚簇索引,或者它没有:

正如两个图所示,这样的非聚集索引不能提供良好的性能,因为它们无法仅从B树中找到喜欢的值(即Lname)。相反,他们必须执行额外的查找步骤(Key或RID查找)以查找Lname的值。并且,这是覆盖索引进入屏幕的地方。这里,ID上的非聚集索引在B树的叶子中紧挨着它的Lname值,并且没有必要对于任何类型的查找。

覆盖查询是一个查询,其中查询结果集中的所有列都是从非聚集索引中提取的。

通过明智的索引安排将查询变为覆盖查询。

覆盖查询通常比非覆盖查询更具性能,部分原因是非聚集索引每页的行数多于聚簇索引或堆索引,因此需要将更少的页面带入内存以满足查询。它们每页有更多行,因为只有部分表行是索引行的一部分。

覆盖索引是在覆盖查询中使用的索引。没有索引这样的东西本身就是覆盖索引。索引可以是关于查询A的覆盖索引,同时不是关于查询B的覆盖索引。

以下是 devx.com上的一篇文章中的内容:

  

创建一个包含SQL查询中使用的所有列的非聚集索引,这种技术称为索引覆盖

我只能假设覆盖查询是一个查询,其索引覆盖了其返回记录集中的所有列。需要注意的是 - 索引和查询必须构建为允许SQL服务器从查询中实际推断索引是否有用。

例如,表的连接本身可能无法从这样的索引中受益(取决于SQL查询执行计划程序的智能):

PersonID ParentID Name
1        NULL     Abe
2        NULL     Bob
3        1        Carl
4        2        Dave

假设 PersonID,ParentID,Name 上有索引 - 这将是查询的覆盖索引,如:

SELECT PersonID, ParentID, Name FROM MyTable

但是像这样的查询:

SELECT PersonID, Name FROM MyTable LEFT JOIN MyTable T ON T.PersonID=MyTable.ParentID

即使所有列都在索引中,也可能不会那么有利。为什么?因为你并没有真正告诉它你想要使用 PersonID,ParentID,Name 的三重索引。

相反,你正在构建一个基于两列的条件 - PersonID ParentID (除了 Name )然后你'要求所有记录,列 PersonID,Name 。实际上,根据实施情况,索引可能有助于后者。但是对于第一部分,你最好还有其他索引。

使用基础表上的索引可以匹配所有谓词的覆盖查询。

这是提高所考虑的sql性能的第一步。

覆盖索引是指给每个必需列并且SQL服务器没有跳回到聚簇索引以查找任何列的索引。这是使用非聚集索引并使用INCLUDE选项覆盖列来实现的。 非键列只能包含在非聚簇索引中。列不能在键列和INCLUDE列表中定义。列名不能在INCLUDE列表中重复。只有在首先删除非键索引后,才能从表中删除非键列。 请在此处查看详细信息

当我简单地回忆起Clustered Index包含已定义表中所有列的按键排序的非堆列表时,灯亮了。然后,单词“簇”指的是存在“簇”的事实。在所有列中,就像那个“热点”中的一群鱼一样。如果没有索引覆盖包含所寻求值的列(等式的右侧),则执行计划使用聚集索引查找聚集索引的请求列的表示,因为它没有在任何其他列中找到所请求的列"覆盖"指数。缺失将导致建议的执行计划中的聚集索引查找运算符,其中所寻求的值在聚集索引所代表的有序列表内的列内。

因此,一种解决方案是创建一个非聚集索引,其中包含索引中包含请求值的列。通过这种方式,无需引用聚簇索引,优化器应该能够在没有提示的情况下将该索引挂钩到执行计划中。但是,如果存在谓词命名单列聚类键和聚类键上标量值的参数,则仍将使用聚簇索引查找运算符,即使在第二列中已存在覆盖索引没有索引的表。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top