目录
一、索引概述
1、什么叫索引
2、索引的作用
二、SQL Server索引下的数据组织结构
1.堆集结构
2.聚集索引结构
3.非聚集索引
4.扩展盘区空间的管理
一、索引概述
1、什么叫索引
数据库中的索引与书籍中的索引类似,在一本书中,利用索引可以快速查找所需信息,无须阅读整本书。在数据库中,索引使数据库程序无须对整个表进行扫描,就可以在其中找到所需数据。
书中的索引是一个词语列表,其中注明了包含各个词的页码。而数据库中的索引是某个表中一列或者若干列值的集合和相应的指向表中物理标识这些值的数据页的逻辑指针清单。
2、索引的作用
- 通过创建唯一索引,可以保证数据记录的唯一性。
- 可以大大加快数据检索速度。
- 可以加速表与表之间的连接,这一点在实现数据的参照完整性方面有特别的意义。
- 在使用ORDER BY和GROUP BY子句中进行检索数据时,可以显著减少查询中分组和排序的时间。
- 使用索引可以在检索数据的过程中使用优化隐藏器,提高系统性能
二、SQL Server索引下的数据组织结构
在 SQL Server 数据库内,索引对象作为 8 KB 页的集合存储。
SQL Server 支持视图上的索引。视图上第一个允许的索引是聚集索引。在视图上执行 CREATE INDEX 语句时,视图的结果集被具体化,并且存储在与有聚集索引的表具有相同结构的数据库中。
每个表或索引视图的数据行存储在 8 KB 数据页集合中。每个数据页都有一个 96 字节的页头,其中包含象拥有该页的表的标识符 (ID) 这样的系统信息。如果页链接在索引列表中,则页头还包含指向下一页及前面用过的页的指针。在页尾有行偏移表。数据行填充页的剩余部分。
1.堆集结构
堆集在 sysindexes 内有一行,其 indid = 0。
sysindexes.FirstIAM 列指向 IAM 页链的 IAM 首页,IAM 页链管理分配给堆集的空间。
SQL Server 2000 使用 IAM 页在堆集中浏览。堆集内的数据页和行没有任何特定的顺序,也不链接在一起。数据页之间唯一的逻辑连接是记录在 IAM 页内的连接。
通过扫描 IAM 页可以对堆集进行表扫描或串行读,以找到容纳这个堆集的页的扩展盘区。因为 IAM 按扩展盘区在数据文件内存在的顺序表示它们,所以这意味着串行堆集扫描一律沿每个文件进行。使用 IAM 页设置扫描顺序还意味着堆集中的行一般不按照插入的顺序返回。
2.聚集索引结构
- 聚集索引对表的物理数据页中的数据按列进行排序,然后再重新存储到磁盘上,即聚集索引与数据是混为一体的,它的叶节点中存储的是实际的数据。
- 每个表只能有一个聚集索引,因为数据行本身只能按一个顺序存储。
- 应当在创建任何非聚集索引之前创建聚集索引。
- 聚集索引的大小平均是表的5%。
- 在创建索引时系统需要比索引的表1.2倍的磁盘空间,索引创建完成后自动回收。
- 聚集索引在 sysindexes 内有一行,其 indid = 1。数据链内的页和其内的行按聚集索引键值排序。所有插入都在所插入行中的键值与排序顺序相匹配时执行。
- SQL Server2000 将索引组织为 B 树。索引内的每一页包含一个页首,页首后面跟着索引行。每个索引行都包含一个键值以及一个指向较低级页或数据行的指针。索引的每个页称为索引节点。B 树的顶端节点称为根节点。索引的底层节点称为叶节点。每级索引中的页链接在双向链接列表中。在聚集索引内数据页组成叶节点。根和叶之间的任何索引级统称为中间级。
- 对于聚集索引,sysindexes.root 指向它的顶端。SQL Server 沿着聚集索引浏览以找到聚集索引键对应的行。
在lname列上创建索引后,查询employee表可以看出表中记录是按lname值的顺序排列;删除lname列上的聚集索引,而在emp_id上创建聚集索引后,表中记录按照emp_id列值顺序排列。
3.非聚集索引
- 非聚集索引具有完全独立于数据行的结构,使用非聚集索引不用将物理数据页中的数据按列排序。非聚集索引的叶节点存储了组成非聚集索引的关键字值和行定位器。
- 如果索引时没有指定索引类型,默认情况下为非聚集索引;
- 应当在创建非聚集索引之前创建聚集索引;
- 每个表最多可以创建249个非聚集索引;
- 最好在唯一值较多的列上创建非聚集索引;
- 经常需要联接和分组查询,应在联接和分组操作中使用的列上创建多个非聚集索引,在任何外键列上创建一个聚集索引。
- 非聚集索引与聚集索引一样有 B 树结构,但是有两个重大差别:
1、数据行不按非聚集索引键的顺序排序和存储。
2、非聚集索引的叶层不包含数据页。 相反,叶节点包含索引行。
- 非聚集索引可以在有聚集索引的表、堆集或索引视图上定义。在 SQL Server 中,非聚集索引中的行定位器有两种形式:
1、如果表是堆集(没有聚集索引),行定位器就是指向行的指针。该指针用文件标识符 (ID)、页码和页上的行数生成。整个指针称为行 ID。
2、如果表有聚集索引,或者索引在索引视图上,则行定位器就是行的聚集索引键。
4.扩展盘区空间的管理
索引分配映射表(IAM)页映射数据库文件中由堆集或索引使用的扩展盘区。
对于任何具有ntext、text和image类型的列的表,IAM页还映射分配给这些类型的页链的扩展盘区。
这些对象中的每一个都有由一个或多个记录所有分配给自己的扩展盘区的IAM页组成的链。
每个对象对每个包含扩展盘区的文件都至少有一个IAM。
如果分配给对象的文件上的扩展盘区的范围超过了一个IAM页可以记录的范围,则扩展盘区可能会在文件上有多个IAM页。
IAM页按需要分配给每个对象,并在文件内随机定位。
Sysindexes.dbo.FirstIAM指向对象的IAM首页,这个对象的所有IAM 页用链条链接在一起。
IAM 页的页首说明IAM所映射的扩展盘区范围的起始扩展盘区。
IAM中还有大位图,该位图内的每个位代表一个扩展盘区。
位图的第一个位代表范围内的第一个扩展盘区,第二个位代表范围内的第二个扩展盘区,依此类推。
如果一个位是0,则不将它代表的扩展盘区分配给拥有该IAM的对象。如果这个位是1,则将它代表的扩展盘区分配给拥有该IAM页的对象。