覆盖查询的非聚簇索引

时间:2014-08-05 07:17:56

标签: sql sql-server-2012

我遇到以下一两个问题;

  

非聚集索引可以涵盖查询。覆盖查询意味着SQL Server可以找到   非聚簇索引中查询所需的所有数据,不需要在基表中进行任何查找。

这是否意味着数据存储在聚集索引叶页中?我认为这些包含指向RID(堆)和聚簇索引键(聚簇索引)的指针,数据存储在那里?

上面的引用也提到了“基表” - 是堆/聚集索引吗?我正在学习将“表格”这个词视为返回数据的形式而不是存储数据的形式,因此听到它被称为存储介质似乎具有误导性。

任何建议/帮助表示赞赏。

1 个答案:

答案 0 :(得分:1)

也许了解其工作原理的最佳方法就是一个例子。

假设您有一个包含fooab列的表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子句的行。

为了使其成立,索引必须具有ab的值作为可访问数据。它可能看起来像这样:

|  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,会发生一些特殊情况:要选择ab的值,我们实际上不需要按指针指向整行,我们可以只扫描索引输出符合条件的对:

|  a  |  b  |
+-----+-----+
|  1  |  1  |
|  2  |  4  |
|  3  |  8  |

无论指向完整行(我称之为row_address)的指针是指向任意堆地址(在非聚集表的情况下),还是基于顺序排列的位置,都是如此在一些索引键上(在聚簇表的情况下)。