您的当前位置:首页正文

MS SQL SERVER 聚簇索引和非聚簇索引区别

2024-11-06 来源:个人技术集锦

在已创建聚簇索引的表上创建的非聚簇索引,与在未创建聚簇索引的表上创建的非聚簇索引,结构上有何区别?


简单说一下吧。

先说堆表:
没有聚集索引时,表是一个堆表,记录不按任何顺序在数据页中存储,也就是存储数据的数据页,它们之间没有什么关联。但是怎么去管理这些数据页?有一种叫索引分配映射 (IAM)页 ,还有全局分配映射表(GAM)等来定位和管理。就是当插入数据时,会在IAM或GAM/SGAM来查找哪些区或页有可用空间才插入。

非聚集索引:
当在堆表创建非聚集索引时,非聚集索引也是存放在页中的,同样有数据,此时非聚集索引会结构化成一棵平衡树,方便快速定位。非聚集索引会有一列行编号(RID),会定位到具体存储数据的数据页,但因为是堆表,数据页直接不是相邻的,如果所查找的数据列不完全在非聚集索引中,看执行计划会有一种叫rid查找,就是通过非聚集索引子叶确定的rid继续查找堆表数据页中的列。

聚集索引:

当堆表创建聚集索引后,整个表存储数据的数据页就按聚集索引键列有序的结构化成一棵平衡树,这样就可以按聚集索引快速查找出某一整行数据。如果有非聚集索引,非聚集索引本身也是一棵树,此时非聚集索引子叶存储的就不是rid了,而是聚集索引的键列(如果聚集索引有3列,非聚集索引都包括这3列)。当按非聚集索引查找数据时,如果没有在非聚集索引全部查找到所有要查询的列,则通过非聚集索引内部的聚集索引列再从聚集索引树查找,所以此时看执行计划,就会有多一个键查找。


定义聚集索引键时使用的列越少越好,这一点很重要。如果定义了一个大型的聚集索引键,则同一个表上定义的任何非聚集索引都将增大许多,因为非聚集索引条目包含聚集键。

显示全文