《MS SQL Server 2000管理员手册》系列——17. 建立与使用索引[1]

[入库:2006年2月23日] [更新:2007年3月24日]

本文简介:

17. 建立与使用索引
什么是索引?
索引概念
建立索引
重新建置索引
使用索引
设计有效的索引
本章总结
对数据库设计者而言,索引是最有用的工具之一。 索引 (index)是一个让您能增进查询效能的辅助结构,它能减少检索查询数据所必须的I/O动作数量。换言之,索引让Microsoft SQL Server 2000以较少的I/O操作来找出数据,减少搜寻数据的量。当您使用数据库数据表的索引来检索数据列时,SQL Server能很快地判断出数据储存的位置并且立即撷取该数据。因此,数据库数据表的索引与书本所用的索引相当类似-两者均提供快速撷取的功能,特别是我们面对大量信息的时候。
在本章中,您将学到索引的基本观念,包括如何建立索引以及SQL Server中有哪几种不同类型的索引可用。您也会学到何时应使用索引、何时不使用索引-因为索引并非无往不利的工具,在某些情况下,使用索引反而可能有害于系统的效能。
什么是索引?
 
如前所述,索引是SQL Server用来存取数据的辅助数据结构。依其类型的不同,索引可能是与数据一起储存,也可能与数据分开储存。撇开其类型不谈,索引的运作方式基本上是相同的,这也是本节中您将学到的部分。
在一个没有索引的系统中,所有数据检索的工作都要靠扫描数据表来完成。在扫描数据表的操作中,所有的数据都需要被读取,并且与查询的数据相互比对。一般说来,我们会尽量避免数据表扫描-因为这种操作会造成惊人的I/O数量,尤其是扫描一份庞大的数据表时,可能要花掉不少的时间并吃掉可观的系统资源。如果使用索引的话,您便能具体的降低I/O操作的数量,提升数据存取的速度并尽快将系统资源释放给其它的作业来使用。
数据库索引是以B型树状结构来组织。索引中的每一分页被称作 索引分页 或 索引节点 。索引结构由顶层的根节点开始。 根节点 (root node)标示出索引的起点;当需要寻找数据时,它是最先被存取的资料。根节点也包含了一些索引数据列;这些索引数据列含有一个键值及一个称为中介节点的指针指向另一个索引分页,如图17-1所示。这种组态是必须的,因为在一个平均大小的数据表中,索引可能是由成千上万的索引分页来构成。借着由根节点起始并浏览中介节点,SQL Server能够「放大」您要的数据。

 
 
图17-1 根节点与中介节点
当我们使用书本中的索引时,使用的方法可能与下面所述极为类似:假设索引是由一页包含「a」、「b」、「c」等字母项目所在部分之页码的目录页所开始。接着翻到「a」这一页,又会发现进入「aa-ab」、「ac-ad」、「ae-af」等范围所在部分的页码。进入「aa」,里面又列有「aaa-aab」、「aac-aad」、「aad-aaf」等范围所在部分的页码。借着这种排列,您可以很快的找到您要的数据,而不用翻遍整本书。索引以根节点作为第一页,与上述方式相当雷同。
一如根节点,每个中介节点包含有索引分页,分页中包含着索引数据列。每个索引数据列指向其它的中介节点或分叶节点,如图17-2。分叶节点由索引的最底层组成。与根节点不同的是,每个中介节点还包含了一份连接到同一层中介节点的连结清单(Linked List)。换句话说,此节点知道相邻节点以及较低层级的节点。
顾名思义,所谓「B型树」,意味着从根节点展开中介节点后其型态犹如树枝般分布。每一组树状结构中同一层的中介节点称为 索引层级 ,如图17-3所示。到达分叶节点(树状结构中最底层的节点)所需的I/O操作数量要依索引层级的数目而定。如果数据库数据表含有的数据很少,根节点可以直接指向分叶节点,索引将不需要包含任何中介节点(当然这种情况不太可能发生)。

 
 
图17-2 显示中介节点与分叶节点的树

 
 
图17-3 索引层级
在一个非丛集索引中,分叶节点包含有键值,以及一个指向数据表中所需数据列的数据列识别码(ROW ID),或者会包含一个丛集索引键值-如果数据表中还有一个丛集索引的话。而在丛集索引中,数据本身即位在分叶节点中(丛集与非丛集索引将在本章稍后 〈索引类型〉 一节中有所说明)。分叶节点中数据列的数量要看索引建立时引用的项目大小。而在丛集索引中,则要视数据的大小而定。
________________________________________
说明
数据列识别码(ROW ID)是SQL Server由档案编号、分页码及数据列号码自动建立的指针。借着数据列识别码,您只需一个额外的I/O操作便可撷取数据。因为您知道要撷取的是哪个分页,而且SQL Server知道分页所在的位置,因此只要单一的I/O操作即可将该分页读入内存之中。这种检索过程的简化也是为何索引能更有效率并增进效能的主要原因。
________________________________________
要特别留心的是,由于索引是以排序方式建立的,任何数据的变更都可能造成额外的负担。举例来说,如果插入动作造成一个新的数据列必须被插入到已经满的分叶节点,SQL Server必须挪出空间给新的数据列。此举必须将近乎半数的数据列移至分叶节点中的另一个分页中。此种数据搬移称为 分页分隔 (Page Split)。分页分隔会造成索引树一连串的分隔动作。透过谨慎的设定 填满因子 (fill factor)可以避免分页分隔,我们会在本章稍后 〈使用填满因子避免分页分隔〉 一节中介绍填满因子。
索引概念
 
现在您已经对索引结构有了基本的了解,接着让我们看一些与索引有关的概念。在本节中,您将学到索引键、索引唯一性以及索引的类型。
索引键
 
 索引键 (index key)指出用于产生索引的一个数据行或数个数据行。索引键是一个让您可以快速找到数据列的值,此数据列包含有您需要的数据。索引键就像是书本中的索引项目,可指向文中特定的主题。要使用索引取得数据列,您必须在SQL陈述式的WHERE子句中包含索引键值,还得要看看索引是一个简单索引还是复合索引。
简单索引
 
 简单索引 (simple index)即为使用单一数据行的索引,如图17-4。如果您要取得索引的效率,则该数据行必须在SQL陈述式的WHERE子句中引用。

 
 
图17-4 简单索引
根据数据储存的数据型别、以及数据行中唯一性项目的数量,还有使用何种类型SQL陈述式等等因素,有时使用简单索引便可以很有效率,但有些情况则可能使用复合索引会比较合适。举例来说,如果您索引的是一个由上千个名字与地址构成的通讯簿, state数据行就不应该是一个简单索引的候选键,因为同一州里可能有很多相同的项目。然而,若在索引中增加street与city数据行,使其成为复合索引,您可以让每个项目近乎唯一。这种方法会很有用-若您的查询是依地址来找数据列的话。
复合索引
 
 复合索引 (composite index)是定义超过一个数据行的索引,如图17-5。复合索引可以利用一个多或个索引键来存取。在SQL Server 2000中,索引最多可包含16个数据行,并且键值总数据长度不可超过900个字节。

本文关键:《MS SQL Server 2000管理员手册》系列——17. 建立与使用索引
  相关方案
Google
 

本站最佳浏览方式为 分辨率 1024x768 IE 6.0(或更高版本的 IE浏览器)

go top