了解如何在非聚集索引中包含主键列
假设我有一个名为'demo'的表,其中包含4列; 'a','b','c'和'd'。 'demo'表中的primary key
clustered index
按该顺序包含列'a'和'b'。了解如何在非聚集索引中包含主键列
从查询中引用表“演示”的“实际执行计划”提出,新non-unique
non-clustered index
所需的列“b”和应该include
列“A”。
如果我创建一个在列“B”,我需要include
列“a”或将它已经成为non-clustered index
的一部分,因为它是在primary key
non-unique
non-clustered index
?
如果主键列'a'已经是非聚集索引的一部分,列'a'存储为include
列还是非聚簇键的一部分?
从查询中引用表“演示”的“实际执行计划”已经 建议,新的非唯一非 列'b'需要聚簇索引,并且应包含列'a'。
...
如果主键列“a”为已非聚集索引的一部分, 是列“A”存储为包括柱或者是它的 非聚集键的一部分?
在你的情况列a
将在非聚集索引各阶层聚集索引键的部分中提出。建议给你的索引是non-unique
,所以它需要uniquefier,聚簇索引键将用于此目的。
如果所提供的指数为独特,列a
将被存储在这个指数作为行定位,在聚集表的情况下,聚集索引键的一部分的叶级。
列a
将不会被存储两次,如果您明确将其包含在索引的included column
中,那么我建议您将其包含在内。当某一天有人决定将聚簇表转换为堆时(通过删除聚簇索引),它将会产生变化。在这种情况下,如果您未在非聚集索引中明确包含第a
列,则它将丢失,并且不再包含在非聚集索引中
试试这个并观察执行计划。你可以看到DB只使用INDEX。所以,据我所知,你不应该在你的索引中包含列A(正如你所说的,Clust。索引键已经包含在内)。
CREATE TABLE DEMO (COLA VARCHAR(10) NOT NULL, COLB VARCHAR(10) NOT NULL, COLC VARCHAR(10), COLD VARCHAR(10));
ALTER TABLE DEMO ADD CONSTRAINT DEMO_PK PRIMARY KEY (COLA, COLB);
CREATE INDEX DEMO_IX1 ON DEMO (COLB);
INSERT INTO DEMO VALUES ('A','B','C','D');
INSERT INTO DEMO VALUES ('A1','B1','C1','D1');
INSERT INTO DEMO VALUES ('A2','B2','C2','D2');
SELECT COLA,COLB FROM DEMO WHERE COLB='B1'
非聚簇索引自动包含聚簇索引键。 在documentation你可以得到很多这方面的信息,尤其是这部分正好说明这一点:
非聚集索引架构
非聚集索引的叶层是由索引页的 代替的数据页面。非聚簇索引行中的行定位符是 或者是指向行的指针,或者是行的聚簇索引键。
如果你的表是一个堆,则行定位器将直接指向包含键值,但如果你的表是不是堆(这是情况下,数据行,因为你已经有一个聚集键在该表上),那么行定位符指向聚簇索引键。
请看clustered and nonclustered indexes described以及。
此线程讨论相同的:Necessary to include clustered index columns in non-clustered indexes?
包括非聚集索引列a
是无用的,因为它是聚簇索引键的一部分。因此,它是非聚集索引叶页中数据的一部分。具有这样
SELECT a FROM tab WHERE b = <value>
查询则a
值将是在非聚集索引叶数据的自然部分。
由于(b)上的NCI不是唯一的,因此a将成为索引中的关键列,所以不仅存在于叶页上。请参阅http://sqlblog.com/blogs/kalen_delaney/archive/2010/03/07/more-about-nonclustered-index-keys.aspx –
PK字段始终是索引键的一部分,而不是包含列的一部分。
我在这里想的或许是想在B列寻找;那只有在列B是索引中的第一个键时才能做到。如果你先定义一个列B的索引,然后是A列,那么它可以做到这一点。看起来,只要两个键都在索引中,它就会很快乐,因为你有一个复合PK,尽管它们现在可能顺序错误(先是A,然后是B),从而阻止了寻找。
在PK场参考其自动显示在指标:https://www.brentozar.com/archive/2013/07/how-to-find-secret-columns-in-nonclustered-indexes/
“PK字段始终是索引关键字的一部分,而不是包含的列“不完全相当”,“聚集索引”列存储为非唯一NCI的关键列,并且包含唯一NCI的列“。请参阅http://sqlblog.com/blogs/kalen_delaney/archive/2010/03/07/more-about-nonclustered-index-keys.aspx –
该列将被包含 - 不是因为它位于主键中,而是因为它在聚簇索引键中。支持主键约束的索引恰好也是您的案例中的聚集索引。 (当然,这是最常见的情况,但值得一提。)其余部分请参见[这里](https://dba.stackexchange.com/questions/57465/necessary-to-include-clustered-index -columns功能于非聚集的索引)。 –