繁体   English   中英

涵盖查询的非聚集索引

[英]Nonclustered indexes covering queries

我在以下方面遇到一两个问题;

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

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

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

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

理解这种工作方式的最佳方法也许就是一个例子。

假设您有一个表foo其中包含abc列,并且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子句的行。

为了使之正确,索引必须将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那里SELECT a, b FROM foo WHERE a < 5 AND b < 10 ,那么会发生一些特殊的情况:选择ab的值,我们实际上不需要跟随指针指向整行,我们可以向下扫描索引,输出匹配条件的对:

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

无论指向整行的指针(我称为row_address )是指向任意堆地址(对于非聚集表)还是基于某个索引键(在集群表的情况)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM