[英]Nonclustered indexes covering queries
我在以下方面遇到一两个问题;
非聚集索引可以覆盖查询。 覆盖查询意味着SQL Server可以在非聚集索引中找到查询所需的所有数据,并且不需要在基表中进行任何查找。
这是否意味着数据存储在聚簇索引叶页中? 我认为这些包含指向RID(堆)和聚集索引键(聚集索引)的指针,并且数据存储在那里?
同样,上面的引用提到了“基表”-是堆/聚集索引吗? 我正在学习将“表”一词视为返回数据的形式,而不是存储数据的形式,因此听到将其称为存储介质的说法似乎具有误导性。
任何建议/帮助表示赞赏。
理解这种工作方式的最佳方法也许就是一个例子。
假设您有一个表foo
其中包含a
, b
和c
列,并且CREATE INDEX foo_a_b ON foo (a, b)
运行CREATE INDEX foo_a_b ON foo (a, b)
。
该表可能如下所示:
| a | b | c |
+-----+-----+-----+
| 1 | 1 | 1 |
| 4 | 10 | 42 |
| 2 | 4 | 42 |
| 5 | 16 | 1 |
| 3 | 8 | 1 |
如果现在运行查询SELECT a, b, c FROM foo WHERE a < 5 AND b < 10
,则DBMS可以使用索引查找满足WHERE
子句的行。
为了使之正确,索引必须将a
和b
的值作为可访问数据。 它可能看起来像这样:
| a | b | row_address |
+-----+-----+---------------+
| 1 | 1 | 0xABDEFC |
| 2 | 4 | 0xAFBDEC |
| 3 | 8 | 0xFABDEC |
| 4 | 10 | 0xCAFEBA |
| 5 | 16 | 0xADDAFF |
如果我们改写SELECT a, b FROM foo WHERE a < 5 AND b < 10
那里SELECT a, b FROM foo WHERE a < 5 AND b < 10
,那么会发生一些特殊的情况:选择a
和b
的值,我们实际上不需要跟随指针指向整行,我们可以向下扫描索引,输出匹配条件的对:
| a | b |
+-----+-----+
| 1 | 1 |
| 2 | 4 |
| 3 | 8 |
无论指向整行的指针(我称为row_address
)是指向任意堆地址(对于非聚集表)还是基于某个索引键(在集群表的情况)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.