日期:2014-05-18  浏览次数:20445 次

请教个索引的基础问题

建立索引的具体实现步骤是个什么情况?

我模糊的理解(瞎想的):
  建立聚集索引的时候(假设按字段ID建立升序聚集索引):1、改变数据文件结构,按照ID进行升序排列;2、对这个数据件建立B+树结构形成聚集索引?那么这个索引是增加到数据文件上的,还是与数据文件分开的?

  非聚集索引:建立索引的时候(假设按字段ID建立升序非聚集索引):1、按照ID进行排序,但不改变数据文件结构;2、对这个排序后的ID顺序创建B+树结构形成索引,并且这个索引的ID指向对应ID实际数据的“位置”。那么这个“位置”又是怎么确定的?地址是对内存而言的,而文件应该实在硬盘中的,这个位置是什么?

--------------------
请大侠指导下,索引的建立到底是个什么样的过程。

------解决方案--------------------
http://topic.csdn.net/u/20090422/16/d37a2b46-54fb-4be6-96c7-2ae004ca0c42.html
------解决方案--------------------
表和索引构架
在 Microsoft® SQL Server ? 2000 数据库内,对象作为 8 KB 页的集合存储。本主题描述表和索引页的组织方式。

SQL Server 2000 支持视图上的索引。视图上第一个允许的索引是聚集索引。在视图上执行 CREATE INDEX 语句时,视图的结果集被具体化,并且存储在与有聚集索引的表具有相同结构的数据库中。存储的结果集与下面的语句所产生的结果集相同:

SELECT * FROM ViewName

每个表或索引视图的数据行存储在 8 KB 数据页集合中。每个数据页都有一个 96 字节的页头,其中包含象拥有该页的表的标识符 (ID) 这样的系统信息。如果页链接在列表中,则页头还包含指向下一页及前面用过的页的指针。在页尾有行偏移表。数据行填充页的剩余部分。



数据页的组织方式
SQL Server 2000 中的表使用下面两种方法组织其数据页。 

聚集表是有聚集索引的表。 
基于聚集索引键按顺序存储数据行。索引按 B 树索引结构实现,B 树索引结构支持基于聚集索引键值对行进行快速检索。每级索引中的页(包括叶级中的数据页)链接在双向链接列表中,但使用键值在各级间导航。

堆集是没有聚集索引的表。 
不按任何特殊顺序存储数据行,数据页序列也没有任何特殊顺序。数据页不在链表内链接。

索引视图与聚集索引表具有相同的存储结构。

SQL Server 在每个表或索引视图上还支持多达 249 个非聚集索引。非聚集索引有一个与聚集索引中相似的 B 树索引结构。不同的是非聚集索引对数据行的顺序不起作用。聚集索引表和索引视图基于聚集索引键按顺序存储数据行。如果为表定义了非聚集索引,对堆集的数据页集合没有影响。除非定义了聚集索引,否则数据页保留在堆集内。

包含 text、ntext 和 image 数据的页作为每个表的单个单元进行管理。一个表的所有 text、ntext 和 image 数据存储在一个页集合内。

sysindexes 表内的页指针定位表、索引和索引视图的所有页集合。每个表和索引视图有一个数据页集合,以及其它一些实现为这个表或视图定义的各个索引的页集合。

每个表、索引和索引视图在 sysindexes 内有一行,由对象标识符 (id) 列和索引标识符 (indid) 列的组合唯一标识。IAM 页链管理分配给表、索引和索引视图的页。sysindexes.FirstIAM 列指向 IAM 页链的 IAM 首页,IAM 页链管理分配给表、索引或索引视图的空间。

每个表在 sysindexes 内有一个行集: 

一个堆集在 sysindexes 内有一行,其 indid = 0。 
FirstIAM 列指向表的数据页集合的 IAM 链。服务器使用 IAM 页查找数据页集合内的页,因为这些页不链接在一起。

某个表或视图上的一个聚集索引在 sysindexes 内有一行,其 indid = 1。 
root 列指向聚集索引 B 树的顶端。服务器使用索引 B 树查找数据页。

为某个表或视图创建的每个非聚集索引在 sysindexes 内有一行。 
每个非聚集索引的行内的 indid 值都从 2 到 250。root 列指向非聚集索引 B 树的顶端。

对于每个至少有一个 text、ntext 或 image 列的表,在 sysindexes 内也有一行,其 indid = 255。 
FirstIAM 列指向管理 text、ntext 和 image 页的 IAM 页链。

在 SQL Server 6.5 版及更早的版本中,sysindexes.first 始终指向堆集的起点、索引叶级的起点或者 text 和 image 页链的起点。在 SQL Server 7.0 版及更高的版本中,很少使用 sysindexes.first。在 SQL Server 6.5 版及更早的版本中,indid = 0 这行内的 sysindexes.root 指向堆集的最后一页。在 SQL Server 7.0 版及更高的版本中,不使用 indid = 0 这行内的 sysindexes.root。


------解决方案--------------------
建立聚集索引的时候(假设按字段ID建立升序聚集索引):
1、改变数据文件结构,按照ID进行升序排列;--是的,改变,按照索引键索创建新的存储空间
2、对这个数据件建立B+树结构形成聚集索引?那么这个索引是增加到数据文件上的,还是与数据文件分开的?--分开 

非聚集索引:建立索引的时候(假设按字段ID建立升序非聚集索引):
1、按照ID进行排序,但不改变数据文件结构;--对的,
2、对这个排序后的ID顺序创建B+树结构形成索引,并且这个索引的ID指向对应ID实际数据的“位置”。
那么这个“位置”又是怎么确定的?地址是对内存而言的,而文件应该实在硬盘中的,这个位置是什么? 
--如果有聚集索引,指向聚集索引位置,如果没有,指向物理记录 全部都是物理位置,记录在非聚集索引页上


答案如上,希望对你有帮助