SQL Server覆盖索引存储机制及大字段存储方式咨询
SQL Server覆盖索引的存储机制及大字段INCLUDE的处理
一、覆盖索引的存储方式
覆盖索引属于非聚集索引的一种,核心是它包含了查询所需的所有列——这些列要么是索引的键列,要么是通过INCLUDE子句添加的非键列。
从存储结构来看:
- 非聚集索引采用B+树结构,非叶子节点存储索引键的层级导航信息;
- 叶子节点会存储完整的索引键值,同时附加
INCLUDE的非键列数据。如果表的聚集索引是主键(INT类型),普通非聚集索引的叶子节点原本只存储主键值用于回表,而覆盖索引通过INCLUDE把额外列加进来后,叶子节点就包含了查询需要的全部数据,无需再去聚集索引中查找,这就是“覆盖”的意义。
二、INCLUDE nvarchar(max)列的存储逻辑
对于你提到的场景:主键是INT类型的聚集索引,覆盖索引通过INCLUDE包含了INT类型的a、b列,以及nvarchar(max)类型的c列,SQL Server的存储规则如下:
- 如果c列的实际数据较小(总字节数未超过数据页的阈值,通常是单页8KB的约80%,即~6000字节),会直接把完整的字符串数据存储在覆盖索引的叶子节点中,和a、b列的INT数据放在一起;
- 如果c列的实际数据较大,超过了上述阈值,SQL Server会把这部分大文本数据单独存储在LOB专用数据页中,而在覆盖索引的叶子节点里只保留一个16字节的LOB指针,指向LOB数据页的具体位置。
简单来说,是否存储完整数据取决于字段的实际大小,大到放不下就用指针指向外部LOB页。
内容的提问来源于stack exchange,提问作者bizzehdee
相关产品推荐
相关产品推荐

