SQL Server 如何处理非聚集索引中的包含列?

Posted

技术标签:

【中文标题】SQL Server 如何处理非聚集索引中的包含列?【英文标题】:How does SQL Server treat Included columns in a nonclustered index? 【发布时间】:2013-12-17 10:08:52 【问题描述】:

我有一个问题:

非聚集索引的定义表明,索引中包含的列在索引大小或最大列数方面不被数据库引擎计算在内。

那么它们的真正工作方式是什么?

当它们不影响索引大小时,它们对 SQL Server 有何帮助?

【问题讨论】:

包含的列值仅存在于叶页中,而不是索引的上层。这使得索引覆盖并避免了查找回基表以检索缺失值的需要。索引宽度的 900 字节限制仅适用于键列。 Index Key Column VS Index Included Column 的可能重复项 【参考方案1】:

需要注意的重要一点是,在确定索引键(用于在索引结构中实际查找数据的值)中的列大小或列数时,数据库引擎不会计算包含的列。它们仍然会增加索引本身的大小。

索引键在构成键的所有列中的大小只能为 900 字节(只能有 16 列构成索引键)。

添加包含的列不计入 900 字节/16 列的限制,但可以通过覆盖更多查询使索引更有用。

【讨论】:

【参考方案2】:

这里其他人的解释很好。

对我来说,包含的索引列很容易记住和使用这个简单的规则: 过滤器,即。 WHERE x = y etc..,是你的键,是否使用索引的决定是基于这些。 SELECT a, b, x 是您实际返回的值,这些是您想要包含在索引中的内容,因此 SQL Server 不必通过聚集索引/堆搜索找到他们。

例子:

CREATE NONCLUSTERED INDEX TABLEX_A_IDX ON TABLEX (A) INCLUDE (B, C)    

SELECT A, B, C -- KEY + INCLUDED columns
FROM TABLEX WHERE A = 'ASD' -- KEY columns

当然,这不完全是你的问题,但它可能会有所帮助。

【讨论】:

以上是关于SQL Server 如何处理非聚集索引中的包含列?的主要内容,如果未能解决你的问题,请参考以下文章

SQL Server 中多列非聚集索引中的列顺序是不是重要?

在 SQL Server 中更改非聚集索引以添加更多包含的列

列存储聚集索引 - 死锁问题 (SQL Server)

浅析SQL Server数据库中的伪列以及伪列的含义

在 SQL Server 2014 中使用聚集列存储索引时,具有大量列的表是不是仍然是反模式?

SQL SERVER数据库 唯一索引 非唯一索引 聚集索引 非聚集索引 之间区别