聚集索引与非聚集索引的基本概念
聚集索引,是一种指明表数据物理存储顺序的索引.在聚集索引中,行的物理存储顺序与索引顺序完全相同,即索引的顺序决定了表中行的存储顺序.表数据按照指定作为聚集索引的一个或多个键列排序并存储.聚集索引类似于一本字典,字典按照字母顺序存储信息,并提供引导字帮助用户快速定位信息的位置,在同一页上找到数据和它的引导字.相似的,聚集索引含有索引页和实际数据页,数据页组成聚集索引的最底层(叶子节点).根节点中的每行将分别指向分支节点,分支节点的行又将指向其他的分支节点,最后一组分支节点将最终指向叶子节点.当你到达索引的最底层(即叶子节点)时,也就已经到达实际数据页了.因为数据按照一个指定的顺序物理地存储,所以你只能为每个表创建一个聚集索引.
非聚集索引与聚集索引不同,它并不在物理上排列数据,即索引中的逻辑顺序并不等同于表中行的物理顺序.索引仅仅记录指向表中行的位置的指针,这些指针本身是有序的,通过这些指针可以在表中快速地定位数据.在它的叶子节点中不含有实际表数据,取而代之的是,索引本身完全与数据分离,就像一本在书的后面带有索引的书(索引只是指明到哪一页,而数据并不与索引本身在一起).非聚集索引的叶子节点含有索引行,用于存储决定行确定位置的索引数据和信息.位置信息可以是两种类型之一,取决于表上是否存在聚集索引.如果有聚集索引,那么对于每行,聚集索引的键值存储在非聚集索引的叶子节点之中,作为该行的定位器.这个值可以被直接用来定位数据,它位于聚集索引的叶子节点之中.如果聚集索引不是一个惟一索引, SQL Server就自动地为所有相同的索引键值分配一个内部值,让它们惟一地以非聚集索引方式使用.这个内部值对于用户来说是不可见的.如果表上没有聚集索引,那么每个叶子节点含有一个行ID作为行的定位器,而不是聚集索引的一个键值.行ID是一个指针,由文件ID,页数目和页中的行数目组成.这个指针能够精确地指示在哪里可以找到行,所以一旦到达行ID,只需要再进行一次I/O便可以读取数据行.