说完了簇索引,接下来我们再说说非簇索引,与Oracle中的普通B-tree索引类似。SQL Server中的非簇索引,首先,其也是通过一个B-tree结构进行组织和存储,该结构同样分为根节点/数据页(Root Node/Page)、中间节点/数据页(Intermediate Nodes/Pages)和叶子节点/数据页(Leaf Nodes/Pages),索引字段的键值按序存储于B-tree结构的叶子数据页中;其次,B-tree结构的叶子数据页中,除了按序组织和存储索引字段的键值外,还在不同情况下,分别存储其基表上簇索引的键值或其基表中数据行的行标识(RID,其为8个字节的数据行地址,其中,2个字节表示数据行所在文件的文件号Fileid,4个字节表示数据行所在数据页在其文件中的页号Pageid,2个字节表示数据行在其数据页中的槽号Slotnumber)。当表上建有簇索引时,该表上的非簇索引中除了包含非簇索引的键值外,还包含簇索引的键值;当表上未建簇索引时,该表上的非簇索引中除了包含非簇索引的键值外,还包含指向其基表中数据行的行标识。当然,SQL Server 2005后的版本中,非簇索引叶子数据页中,除了包含非簇索引键值、簇索引键值或行标识外,还可以根据非簇索引的定义(Include选项)而包含其他字段的值;而SQL Server2008后的版本中,引入了过滤索引(Flitered index)的概念,这将导致非簇索引叶子数据页中只包含那些