首页 > 解决方案 > 如果一个表有 'id' 列作为它的聚集索引,那么在任何其他非聚集索引中添加 'id' 列作为包含列有什么好处

问题描述

如果表将“id”(主键)列作为其聚集索引,那么在 Microsoft SQLServer 中的任何其他非聚集索引中添加“id”列作为包含列有什么好处?

例如:- 表'xyz'

ID 姓名 地位 日期
1 美国广播公司 积极的 2021-06-23
CREATE NONCLUSTERED INDEX [NonClusteredIndex_status_Date]
                ON [xyz]
                    (   
                        [status] ASC,
                        [date] ASC
                    )
                INCLUDE
                    (   [id],
                        [name]
                    ) 

而这个非聚集索引的目标是在大型数据集上进行类似于下面的查询。在实际情况下,可能还有其他一些查询。

select * from xyz where status='active' and date > '2021-06-20'

标签: sqlsql-serverindexingnon-clustered-index

解决方案


你的问题的答案基本上是不,没有好处。

在表上创建非聚集索引时,索引中的每一行都需要能够指向基表中的行。

如果基表是,则索引中的每一行都将包含一个指向rid(行标识符)的指针,这是 SQL Server 用来唯一标识每一行的。

当表使用聚集索引定义时,每个非聚集索引将自动包含聚集索引列作为基表中行的键。

您可以在执行计划中看到这一点,其中使用了非聚集索引,SQL Server 必须从基表中检索其他列;如果表是,它将是RID 查找,如果表有聚集索引,它将是键查找

此外,如果聚集索引不是唯一的,SQL Server 会添加自己的唯一值以确保唯一性,这也包含在非聚集索引中。

因此,当涉及到非聚集索引时,是否指定聚集索引列并不重要——你可以这样做,这样做没有害处,但它/它们总是被包括在内。


推荐阅读