SQLServer中使用页为存储单元的,那么在建立索引时,其索引节点就是页了,然后树的键值就是存放到这些页(节点)中的。就是说表中的数据行就是存放到页上的,一个表有多个页构成,这些页以树的结构存放。
聚集索引
如下图为聚集索引的存储结构(图片来自网络)。其中可以看出页有两种:Index Rows(索引页)、data rows(数据页),所有非叶子节点都存放着索引项,数据行是存放在叶子节点中的,只有叶子节点才真实存放着表中的每一行数据,而其他非叶子节点的页都存放着聚集索引的键值。因此查询数据的时间复杂度都是一样的,就是该树的深度。
在4.2中有说明,聚集索引决定了表数据的存储顺序,具体可以参考4.2。若表没有创建聚集索引,则表数据时一个无序的堆结构。
非聚集索引
与聚集索引的存储结构唯一不一样的,就是非聚集索引中不存储真正的数据行,因为在聚集索引中已经存放了数据,非聚集索引只包含一个指向数据行的指针即可。如下图所示: