Chinaunix首页 | 论坛 | 博客
  • 博客访问: 9265897
  • 博文数量: 299
  • 博客积分: 9955
  • 博客等级: 中将
  • 技术积分: 4177
  • 用 户 组: 普通用户
  • 注册时间: 2008-02-27 20:59
文章分类
文章存档

2015年(1)

2012年(2)

2011年(9)

2010年(47)

2009年(108)

2008年(132)

我的朋友

分类: Mysql/postgreSQL

2009-10-02 11:29:31

第22学时索引和数据完整性
既然你已经知道了怎样创建数据库中的大多数对象以及使用访问这些对象的语言,你就
该想到索引是怎样工作的及它们在服务器中是怎样实现的。索引是一种加速访问表中数据的
方法。如果创建正确的话,索引不仅能提高S E L E C T语句的速度,而且也能提高U P D AT E和
D E L E T E语句的速度。这是因为U P D AT E和D E L E T E语句像S E L E C T语句一样,在数据修改以
前必须找到表中要受到影响的行。然而应当引起注意的是,创建的索引越多,数据变化时为
了保持索引同步所承受的负担就越大。因此,增加索引可能会降低修改数据时的性能。
本学时的要点包括:
• 索引的用途
• 索引类型
• 创建索引
• 数据完整性
• 触发器
22.1 索引的用途
索引用来帮助SQL Server在表中查找数据。最简单的理解方法是,设想你表中的数据被
存储在一套书中,比如百科全书。为要找到gooney birds的项目,你首先要找的是G这一卷,
找到G卷之后再按字母顺序找到gooney birds。如果书中的数据是随机摆放的,为找到感兴趣
的项目你就不得不查遍每一本书了。索引的道理也同样如此。如果数据没有按任何一种顺序
排列,SQL Server在表中查询可能会很费时间。
22.2 索引类型
SQL Server支持两种基本类型的索引。在这两种基本类型的索引之上你可以增加得到一
个唯一索引的功能,该索引迫使所有插入索引中的值都必须保持唯一。两种基本类型的索引
是簇索引和非簇索引。
22.2.1 簇索引
簇索引是一种特殊索引,它使数据按照索引的排序顺序存放表中。簇索引类似于字典,
即所有词条在字典中都以字母顺序排列。簇索引实际上重组了表中的数据,所以你只能在表
中建立一个簇索引。
当数据按值的范围查询时,簇索引就显得特别有用。因为所有SQL Server都必需先找到
所查询范围的第一行,然后依次下去,直到该范围的最后一个值找到为止,并且保证了所有
其他值也落在这个范围内。举一个例子,一个应用程序要查找首字母位于G和P之间的姓名列
表,SQL Server首先找到以字母G开头的名字,取出所有记录,直到找到以字母P开头的名字
为止,这种方法使得查询过程非常高效。
当你准备在表中创建簇索引时必须考虑到以下几点:
• 你应该在尽可能少的列上定义一个簇索引。在表中创建的任何其他的索引都比正常的要
大,因为它们不仅包含其他索引的值,而且还包含簇索引的关键字。
• 当列具有相对数量较少的相异值时,比如世界上国家的名称,创建簇索引应该说是个好
主意。
• 如果要索引的值极少,例如一个列包含的全都是1和0,创建簇索引就不是个好主意。
• 如果访问一个表并使用B E T W E E N、<、>、> =或< =操作符来返回一个范围的值时,应
该考虑使用簇索引。
• 如果表中的值是按照顺序访问的,应该考虑使用簇索引。
• 如果访问表经常是为了返回一大堆数据,应该考虑使用簇索引。
• 如果表经常由一个指定的列来排序,该列将是簇索引的最佳候选列。这是因为表中的数
据已经为你排好序了。
• 对于追求快速的应用程序,搜索用的那个列是簇索引的最佳候选列。
• 进行大量数据改动的表不适宜用簇索引,因为SQL Server将不得不在表中维护行的次
序。
22.2.2 非簇索引
非簇索引中的数据顺序不同于表中的数据存放顺序。这种类型的索引类似于课本里的索
引。表里的数据存放无任何顺序,而该索引仅有一个按关键字的排序值和一个指向对应数据
的指针,犹如页码一样。SQL Server使用这种索引的方法,就像你使用课本里的索引一样。
当要查寻某个特定值时,只需找到关键字的值,然后再到表中从索引指定的地方检索出数据。
如果表包含一个簇索引,索引指针实际上指向的是簇索引的关键字。如果表中没有簇索引,
索引指针则指向行标识(即R I D )。
非簇索引的一大优点是可以在同一个表中创建多个非簇索引。这样在以几种不同的方式
访问表时,就可以根据这几种访问方式在表中创建不同的索引。
当你准备在表中创建非簇索引时,必须考虑到以下几点:
• 当列包括大量唯一的值时,如姓名或地址,此时可以在表中建立簇索引。
• 同簇索引一样,如果列中包含的相异值极少,比如仅有0和1,就没有必要建立索引。
• 当查询不返回大量数据时最适合于非簇索引。
• 当应用程序要求通过大量的连结来创建结果集时,应该考虑使用高度索引的表。
可以在一个表中对多个列创建索引,这些索引称为复合索引。当用户在S E L E C T语句的
W H E R E子句下使用多个列时,这些索引就显得特别有用。举例来说,用户通常要查寻作者住
在哪个州哪个城市,这时就要对这两个列创建一个索引。
22.2.3 唯一索引
你不能单独创建一个唯一索引,唯一索引是作为簇索引或非簇索引的一部分而创建的。
唯一索引用来保证索引数据的唯一性。如果创建的索引包含多个列,唯一索引将保证包含在
索引中的所有值的组合是唯一的。应用唯一索引的一个例子是包含社会保险号码的列,这个
列是最适合于创建唯一索引,因为在理论上,没有两个人拥有同样的社会保险号码。另一方
2 1 4 SQL Server 7 24学时教程
下载
面,名和姓的组合不适合于创建唯一索引,因为这样你就不可能在表中存放同名同姓的人了。
当你在表中创建U N I Q U E或P R I M A RY KEY约束后,SQL Server将会在表中自动生成一个唯一
索引。
22.3 创建索引
既然你对表中可创建的索引类型有了一个了解,下面应该看看怎样实际创建索引了。就
像在数据库中创建其他大多数对象一样,有两种方法可生成索引。第一种是使用S Q L
Enterprise Manager。下面将分步骤教你如何使用SQL Enterprise Manager创建索引:
1) 打开SQL Enterprise Manager,连接到包含数据库的服务器上,这个数据库里有你要创
建索引的表。为了教学的方便,继续使用我们一直在用的p u b s数据库。
2) 点击服务器名称旁边的加号,再双击“ D a t a b a s e s”文件夹旁边的加号,这样就打开了
该服务器里所有数据库的列表。
3) 点击“Ta b l e s”文件夹旁边的加号,这样就打开了数据库中的所有表,如图2 2 - 1所示。
点击你想创建索引的表的名称。
4) 选择你想要创建索引的表,从“ To o l s”菜单中选取“Wi z a r d”菜单项,这样就打开了
“Select Wi z a r d”对话框。如图2 2 - 2所示。
5) 点击“D a t a b a s e”选项旁边的加号,然后点击“ Create Index Wi z a r d”。这样就打开了
一个介绍屏幕,如图2 2 - 3所示。
6) 下一屏如图2 2 - 4所示,允许你选择数据库的名称以及你要创建索引的表的名称。如果
你在第三步中没有选择数据库,现在仍然可以选择。
7) 下一屏是“Current Index Information”对话框,如图2 2 - 5所示。如果表中有任何已经
创建的索引都会反映在此对话框里。
8) 下一屏是“ Select Columns”对话框,如图2 2 - 6所示。从这个对话框中你可以选择任何
可用作索引的列。这里,我们选中Z i p列。
第2 2学时索引和数据完整性2 1 5
下载
图22-1 数据库中所有表的
列表
2 1 6 SQL Server 7 24学时教程
下载
图22-2 “Select Wi z a r d”对
话框
图22-3 Create Index Wi z a r d
的介绍屏幕
图22-4 “Select atabase
and Ta b l e”对话框
9) 下一屏是“ Specify Index Options”,如图2 2 - 7所示,可以让你为该索引指定选项。如果
表中还没有簇索引的话,你可以指定该索引为簇索引。如果你需要还可把它定为唯一索引。
这些选项下面的部分用来为索引指定“ Fill Factor”。“Fill Factor”是SQL Server将要填充索引
页的百分比。你的最佳选择是让SQL Server填充索引页到优化级。
10) 下一屏“Completing the Create Index Wi z a r d”对话框,如图2 2 - 8所示,概括了加入到
索引中的列,并允许你为该索引取一个名称。
第2 2学时索引和数据完整性2 1 7
下载
图22-5 “ Current Index
I n f o r m a t i o n”对话

图22-6 “Select Columns”
对话框
图22-7 “ Specify Index
O p t i o n”对话框
11) 完成所有这些操作之后,点击“ F i n i s h”按钮, SQL Server会开始为你创建索引。完
成之后,SQL Server会弹出一个信息框告诉你,索引已经创建完毕。
另一种在表中创建索引的方法是用SQL Query Analyzer运行C R E ATE INDEX命令。该命
令的语法如下:
选项描述
U N I Q U E 该关键字用来指定所要创建的索引是一个唯一索引。这个关键字必须和
另外一个索引创建关键字联合使用
C L U S T E R E D 该关键字用来指定所要创建的索引是一个簇索引。该关键字不能和N O C L -
U S T E R E D关键字一起使用,每一个表只能创建一个簇索引
N O C L U S T E R E D 该关键字用来指定所要创建的索引是一个非簇索引。该关键字不能和
C L U S T E R E D关键字一起使用,每个表最多可以有2 4 9个非簇索引
< i n d e x n a m e > 这是你要创建的索引的名称。索引名称必须符合前几学时所述的命名标

< t a b l e > 这是要创建索引的表的名称
< c o l u m n > 这是将要包括在索引中的列的名称,在复合索引中这些列的总长度不能
超过9 0 0字节
,. . . n 它用来指明加到索引关键字中的多个列
PA D I N D E X 该选项用于告诉SQL Server你想在每个索引页上留出空间。仅当指定f i l l
F a c t o r时,该特性才能使用。缺省时, SQL Server将会在每一页上留有足
够插入一行的空间
F I L L FA C TO R 该选项用来告诉SQL Server在最初创建索引时,该索引页面的叶级填充
度是百分之几。当你为一个经常需要插入数据的表创建索引时,该选项显
得非常有用。因为当索引页都满之后, SQL Server必须把索引页分开以便
为新建的索引行产生空间。你可以在1%到1 0 0%之间指定一个值。你不
要指定1 0 0%,除非不再对表进行I N S E RT操作或U P D AT E操作
2 1 8 SQL Server 7 24学时教程
下载
图22-8 “Completing the
Create Index Wi z -
a r d”对话框
(续)
选项描述
I G N O R E D U P K E Y 当向唯一索引中插入值时,该选项用来控制所发生的情况。如果该选项
已指定且插入一个重复的行到表中, SQL Server将发出一个警告,并且忽
略重复的行。如果没有指定该选项, SQL Server将会发出一个警告,并回
滚插入语句
D R O P E X I S T I N G 该选项允许你强制SQL Server删除并重建你在语句中命名的索引。记住,
簇索引重建时将导致表中的非簇索引也重建
S TAT I S T I C S N O R E C O M P U T E 该选项用来告诉SQL Server 不要自动重构索引的统计信息。如果选中了
该项,你必须运行U P D ATE STAT I S T I C S命令以保持索引统计信息的是最
新的
< f i l e g r o u p > 该选项用来告诉SQL Server在一个特定的文件组上建立索引
通过脚本来创建索引时有很多选项可用,正常使用时只需其中一部分即可。程序清单2 2 -
1将会生成一个a u t h o r s表s t a t e列上的非簇索引。
程序清单22-1 创建一个索引
C R E ATE INDEX nci_state ON authors(state)
22.4 数据完整性
数据完整性是指数据库中数据的精确性和可靠性。数据完整性在所有的用户环境下都很
重要,尤其是在多用户环境下共享数据时。在所有关系型数据库管理系统中,数据完整性都
是要涉及到的重要内容。数据完整性是确保数据库中的数据具有最高质量的处理过程。举一
个例子:假如t i t l e s表中有一本书的t i t l e i d是5 6 7 3 4,你就不能输入另外一本书也以5 6 7 3 4作为
t i t l e i d。数据完整性的另一个例子是让SQL Server只允许特定的值加到一个列中,而不许其
他的值加入。另外一种数据完整性类型是告诉SQL Server,如果一个表的一列中不存在某个
值,那么同样值也不能在其他的表中存在。
这三个数据完整性的例子属于下面四种关于数据完整性的不同定义之一:
• 实体完整性—实体完整性是让SQL Server保持表中特定列的值唯一的处理,可以通过
使用P R I M A RY KEY或U N I Q U E约束来强制实体完整性。
• 域完整性—域完整性是强制列值有效性的处理。可以通过数据类型定义来限制进入表
的数据类型,通过使用C H E C K约束限制数据格式,通过使用FOREIGN KEY约束、缺省
值、C H E C K约束以及NOT NULL约束来使一个列只允许某些值。
• 引用完整性—引用完整性是保持表之间关系的处理。通过使用引用P R I M A RY KEY约
束的FOREIQN KEY约束可以保持引用完整性。该关系可以使SQL Server避免以下操作:
只向从表添加记录而不向主表添加记录,只改变主从表其中一个表的值而导致孤立记录
或只删除一个表中的记录而导致孤立记录。
• 用户定义完整性—用户定义完整性可以通过使用触发器和存储过程来强制。这样可以
允许创建业务规则来确保值的有效性,从而使之落在需要范围之内。
22.5 触发器
最后也是最重要的,你必须学习触发器。触发器类似于存储过程,事实上它们都是一组
第2 2学时索引和数据完整性2 1 9
下载
SQL 语句。主要的区别在于触发器是怎样运行的。当一行被插入、更新或从表中删除时,触
发器才运行,同时这还取决于触发器是怎样创建的。在数据修改时,触发器是强制业务规则
的一种强有力的方法。一个表最多有三种不同的触发器。当U P D ATE 发生时使用一个触发器,
DELETE 发生时使用一个触发器, I N S E RT发生时使用一个触发器。触发器可以是SQL Server
自动处理业务规则的一种方法。举一个例子,当某个作者已经出售了足够的书达到了出版商
预支的稿酬的对应数目后,触发器能用来自动计算版税款。当表中的记录成功更新后触发器
触发。如果出现语法错误或违反约束而导致更新失败,触发器不会触发。
在使用触发器时有一点你要特别小心。尽管触发器功能强大,但是它们也可能对服务器
的性能很有害。你应该非常小心,不要在触发器中放置太多的功能,因为它将降低响应速度,
使你的用户等得不耐烦。
22.6 课时小结
在这一学时里,我们学习了索引并讨论了怎样利用索引。当创建数据库时要记得添加索
引到表中去,这很重要。在建立索引时,你必须要查看你的用户是怎样和表进行交互的以选
择最佳的索引方式。
22.7 专家答疑
问题:我可以创建很多的索引吗?
解答:尽管索引很重要,但不要创建太多的索引。这是因为SQL Server 必须维护所有的
索引,这样就为服务器增加了负担。创建的索引越多,服务器负担越重。最佳的选择是了解
对表的访问方式,然后为那些必要的列建索引。
问题:通过使用触发器或其他约束来强制数据的完整性,那个方法更好些?
解答:尽可能地使用约束来强制表中数据的完整性。因为使用约束而不使用触发器,不
会为服务器增加多大负担。
22.8 课外作业
这些思考题和练习题是供你加深理解用的。答案可以在附录“答案”中找到。
22.8.1 思考题
1) 什么是索引?
2) 什么是簇索引?
3) 什么是非簇索引?
4) 在一个表中可以建立多个簇索引吗?
5) 为了保证进入表的数据在另一个表中有一个匹配记录,应使用哪种类型的数据完整性?
6) 什么叫实体完整性?
7) 触发器的作用是什么?
22.8.2 练习题
在a u t h o r s表中创建一个包括州名列和城市名列的复合非簇索引。
阅读(663) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~