数据库中的索引与书籍中的索引类似,在一本书中,利用索引可以快速查找所需信息,无须阅读整本书。在数据库中,索引使数据库程序无须对整个表进行扫描,就可以在其中找到所需数据。
书中的索引是一个词语列表,其中注明了包含各个词的页码。而数据库中的索引是某个表中一列或者若干列值的集合和相应的指向表中物理标识这些值的数据页的逻辑指针清单。
在 SQL Server 数据库内,索引对象作为 8 KB 页的集合存储。
SQL Server 支持视图上的索引。视图上第一个允许的索引是聚集索引。在视图上执行 CREATE INDEX 语句时,视图的结果集被具体化,并且存储在与有聚集索引的表具有相同结构的数据库中。
每个表或索引视图的数据行存储在 8 KB 数据页集合中。每个数据页都有一个 96 字节的页头,其中包含象拥有该页的表的标识符 (ID) 这样的系统信息。如果页链接在索引列表中,则页头还包含指向下一页及前面用过的页的指针。在页尾有行偏移表。数据行填充页的剩余部分。
堆集在 sysindexes 内有一行,其 indid = 0。
sysindexes.FirstIAM 列指向 IAM 页链的 IAM 首页,IAM 页链管理分配给堆集的空间。
SQL Server 2000 使用 IAM 页在堆集中浏览。堆集内的数据页和行没有任何特定的顺序,也不链接在一起。数据页之间唯一的逻辑连接是记录在 IAM 页内的连接。
通过扫描 IAM 页可以对堆集进行表扫描或串行读,以找到容纳这个堆集的页的扩展盘区。因为 IAM 按扩展盘区在数据文件内存在的顺序表示它们,所以这意味着串行堆集扫描一律沿每个文件进行。使用 IAM 页设置扫描顺序还意味着堆集中的行一般不按照插入的顺序返回。
在lname列上创建索引后,查询employee表可以看出表中记录是按lname值的顺序排列;删除lname列上的聚集索引,而在emp_id上创建聚集索引后,表中记录按照emp_id列值顺序排列。
1、数据行不按非聚集索引键的顺序排序和存储。
2、非聚集索引的叶层不包含数据页。 相反,叶节点包含索引行。
1、如果表是堆集(没有聚集索引),行定位器就是指向行的指针。该指针用文件标识符 (ID)、页码和页上的行数生成。整个指针称为行 ID。
2、如果表有聚集索引,或者索引在索引视图上,则行定位器就是行的聚集索引键。
索引分配映射表(IAM)页映射数据库文件中由堆集或索引使用的扩展盘区。
对于任何具有ntext、text和image类型的列的表,IAM页还映射分配给这些类型的页链的扩展盘区。
这些对象中的每一个都有由一个或多个记录所有分配给自己的扩展盘区的IAM页组成的链。
每个对象对每个包含扩展盘区的文件都至少有一个IAM。
如果分配给对象的文件上的扩展盘区的范围超过了一个IAM页可以记录的范围,则扩展盘区可能会在文件上有多个IAM页。
IAM页按需要分配给每个对象,并在文件内随机定位。
Sysindexes.dbo.FirstIAM指向对象的IAM首页,这个对象的所有IAM 页用链条链接在一起。
IAM 页的页首说明IAM所映射的扩展盘区范围的起始扩展盘区。
IAM中还有大位图,该位图内的每个位代表一个扩展盘区。
位图的第一个位代表范围内的第一个扩展盘区,第二个位代表范围内的第二个扩展盘区,依此类推。
如果一个位是0,则不将它代表的扩展盘区分配给拥有该IAM的对象。如果这个位是1,则将它代表的扩展盘区分配给拥有该IAM页的对象。