我遇到以下一两个问题;
非聚集索引可以涵盖查询。覆盖查询意味着SQL Server可以找到 非聚簇索引中查询所需的所有数据,不需要在基表中进行任何查找。
这是否意味着数据存储在聚集索引叶页中?我认为这些包含指向RID(堆)和聚簇索引键(聚簇索引)的指针,数据存储在那里?
上面的引用也提到了“基表” - 是堆/聚集索引吗?我正在学习将“表格”这个词视为返回数据的形式而不是存储数据的形式,因此听到它被称为存储介质似乎具有误导性。
任何建议/帮助表示赞赏。
答案 0 :(得分:1)
也许了解其工作原理的最佳方法就是一个例子。
假设您有一个包含foo
,a
和b
列的表c
,并且您运行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
,会发生一些特殊情况:要选择a
和b
的值,我们实际上不需要按指针指向整行,我们可以只扫描索引输出符合条件的对:
| a | b |
+-----+-----+
| 1 | 1 |
| 2 | 4 |
| 3 | 8 |
无论指向完整行(我称之为row_address
)的指针是指向任意堆地址(在非聚集表的情况下),还是基于顺序排列的位置,都是如此在一些索引键上(在聚簇表的情况下)。