第10章视图和索引PPT课件

上传人:夏** 文档编号:568473823 上传时间:2024-07-24 格式:PPT 页数:62 大小:100.50KB
返回 下载 相关 举报
第10章视图和索引PPT课件_第1页
第1页 / 共62页
第10章视图和索引PPT课件_第2页
第2页 / 共62页
第10章视图和索引PPT课件_第3页
第3页 / 共62页
第10章视图和索引PPT课件_第4页
第4页 / 共62页
第10章视图和索引PPT课件_第5页
第5页 / 共62页
点击查看更多>>
资源描述

《第10章视图和索引PPT课件》由会员分享,可在线阅读,更多相关《第10章视图和索引PPT课件(62页珍藏版)》请在金锄头文库上搜索。

1、数据库原理与应用教程数据库原理与应用教程第第10章章 视图和索引视图和索引1第第10章章 视图和索引视图和索引o数据库的基本表是根据所有用户的需求按照数据库设数据库的基本表是根据所有用户的需求按照数据库设计人员的观点设计的,并不一定符合用户的应用需求。计人员的观点设计的,并不一定符合用户的应用需求。SQLServer可以根据各个用户的需求重新定义表的可以根据各个用户的需求重新定义表的数据结构,这种数据结构就是视图。索引是以表列为数据结构,这种数据结构就是视图。索引是以表列为基础的数据库对象,它保存着表中排序的索引列,并基础的数据库对象,它保存着表中排序的索引列,并且记录了索引列在数据表中的物理

2、存储位置,实现了且记录了索引列在数据表中的物理存储位置,实现了表中数据的逻辑排序。索引可以使数据库程序在最短表中数据的逻辑排序。索引可以使数据库程序在最短的时间内找到所需要的数据,而不必查找整个数据库,的时间内找到所需要的数据,而不必查找整个数据库,这样可以节省时间,提高查找效率。这样可以节省时间,提高查找效率。2第第10章章 视图和索引视图和索引o在数据库的三级模式结构当中,索引对应的是内模式在数据库的三级模式结构当中,索引对应的是内模式部分,基本表对应的是模式部分,而视图对应的是外部分,基本表对应的是模式部分,而视图对应的是外模式部分。模式部分。o本章主要介绍视图的基本概念,视图的创建、修

3、改和本章主要介绍视图的基本概念,视图的创建、修改和删除,利用视图实现对基本表中数据的操作;索引的删除,利用视图实现对基本表中数据的操作;索引的基本概念,索引的分类以及创建、修改和删除索引等基本概念,索引的分类以及创建、修改和删除索引等操作。操作。310.1 视图视图o视图视图(View)是关系数据库系统提供给用户以多种是关系数据库系统提供给用户以多种角度观察数据库中数据的重要机制,在用户看来,角度观察数据库中数据的重要机制,在用户看来,视图是通过不同路径去看一个实际表,就像一个视图是通过不同路径去看一个实际表,就像一个窗口,我们通过窗口去看外面的高楼,可以看到窗口,我们通过窗口去看外面的高楼,

4、可以看到高楼的不同部分,而透过视图可以看到数据库中高楼的不同部分,而透过视图可以看到数据库中自己感兴趣的内容。自己感兴趣的内容。410.1.1 视图概述视图概述o视图作为一种数据库对象,为用户提供了一个可视图作为一种数据库对象,为用户提供了一个可以检索数据表中数据的方式。视图是一个虚表,以检索数据表中数据的方式。视图是一个虚表,可以视为另一种形式的表,是从一个或多个表中可以视为另一种形式的表,是从一个或多个表中使用使用SELECT语句导出的虚表,那些用来导出视语句导出的虚表,那些用来导出视图的表称为基本表。图的表称为基本表。510.1.1 视图概述视图概述o用户通过视图来浏览数据表中感兴趣的部

5、分或全部数用户通过视图来浏览数据表中感兴趣的部分或全部数据,而数据的物理存储位置仍然在基本表中。所以视据,而数据的物理存储位置仍然在基本表中。所以视图并不是以一组数据的形式存储在数据库中,数据库图并不是以一组数据的形式存储在数据库中,数据库中只存储视图的定义,而不存储视图对应的数据,这中只存储视图的定义,而不存储视图对应的数据,这些数据仍存储在导出视图的基本表中,视图实际上是些数据仍存储在导出视图的基本表中,视图实际上是一个查询结果。当基本表中的数据发生变化时,从视一个查询结果。当基本表中的数据发生变化时,从视图中查询出来的数据也随之改变。图中查询出来的数据也随之改变。o使用视图可以集中、简化

6、和定制用户的数据库显示,使用视图可以集中、简化和定制用户的数据库显示,用户可以通过视图来访问数据,而不必直接去访问该用户可以通过视图来访问数据,而不必直接去访问该视图的基本表。视图的基本表。61. 视图的优点视图的优点o(1) 为用户集中数据,简化用户的数据查询和处理。使为用户集中数据,简化用户的数据查询和处理。使得分散在多个表中的数据,通过视图定义在一起,屏蔽得分散在多个表中的数据,通过视图定义在一起,屏蔽了数据库的复杂性,用户不必输入复杂的查询语句,只了数据库的复杂性,用户不必输入复杂的查询语句,只需针对此视图做简单的查询即可。需针对此视图做简单的查询即可。o(2)保证数据的逻辑独立性。对

7、于视图的操作,例如,查保证数据的逻辑独立性。对于视图的操作,例如,查询只依赖于视图的定义,当构成视图的基本表需要修改询只依赖于视图的定义,当构成视图的基本表需要修改时,只需要修改视图定义中的子查询部分,而基于视图时,只需要修改视图定义中的子查询部分,而基于视图的查询不用改变。的查询不用改变。o(3) 重新定制数据,使得数据便于共享。重新定制数据,使得数据便于共享。o(4) 数据保密。对不同的用户定义不同的视图,使用户数据保密。对不同的用户定义不同的视图,使用户只能看到与自己有关的数据。同时简化了用户权限的管只能看到与自己有关的数据。同时简化了用户权限的管理,增加了安全性。理,增加了安全性。 7

8、2. 视图的分类视图的分类oSQLServer2005中,视图可以分为标准视图、索引视图和分区视图。中,视图可以分为标准视图、索引视图和分区视图。o(1)标准视图)标准视图o标准视图组合了一个或多个表中的数据,可以获得使用视图的大多标准视图组合了一个或多个表中的数据,可以获得使用视图的大多数好处,可以实现对数据库的查询、修改和删除等基本操作。数好处,可以实现对数据库的查询、修改和删除等基本操作。o(2)索引视图)索引视图o索引视图是被具体化了的视图,它已经过计算并存储。可以为视图索引视图是被具体化了的视图,它已经过计算并存储。可以为视图创建索引,即对视图创建一个唯一的聚集索引。索引视图可以显著

9、创建索引,即对视图创建一个唯一的聚集索引。索引视图可以显著提高某些类型查询的性能。索引视图尤其适于聚合许多行的查询,提高某些类型查询的性能。索引视图尤其适于聚合许多行的查询,但不太适合于经常更新的基本数据集。但不太适合于经常更新的基本数据集。o(3)分区视图)分区视图o分区视图在一台或多台服务器间水平连接一组成员中的分区数据。分区视图在一台或多台服务器间水平连接一组成员中的分区数据。这样,数据看上去如同来自于一个表。这样,数据看上去如同来自于一个表。810.1.2创建视图创建视图o要使用视图,首先必须创建视图。视图在数据库中是作为一要使用视图,首先必须创建视图。视图在数据库中是作为一个独立的对

10、象存储的,必须遵循以下原则。个独立的对象存储的,必须遵循以下原则。o(1)只能在当前数据库中创建视图。但是,如果使用分布式查只能在当前数据库中创建视图。但是,如果使用分布式查询定义视图,则新视图所引用的表和视图可以存在于其他数询定义视图,则新视图所引用的表和视图可以存在于其他数据库中,甚至其他服务器上。据库中,甚至其他服务器上。o(2)视图名称必须遵循标识符的规则,且对每个用户必须唯一。视图名称必须遵循标识符的规则,且对每个用户必须唯一。此外,该名称不得与该用户拥有的任何表的名称相同。此外,该名称不得与该用户拥有的任何表的名称相同。o(3)用户可以在其他视图之上建立视图。用户可以在其他视图之上

11、建立视图。o(4)如果视图中的某一列是一个算术表达式、内置函数或常量如果视图中的某一列是一个算术表达式、内置函数或常量派生而来,而且视图中两个或者更多的不同列拥有一个相同派生而来,而且视图中两个或者更多的不同列拥有一个相同的名字的名字(这种情况通常是因为在视图的定义中有一个连接,而这种情况通常是因为在视图的定义中有一个连接,而且这两个或者多个来自不同表的列拥有相同的名字且这两个或者多个来自不同表的列拥有相同的名字),此时,此时,用户需要为视图的每一列指定特定的名称。用户需要为视图的每一列指定特定的名称。910.1.2创建视图创建视图o(5)定义视图的查询不可以包含定义视图的查询不可以包含ORD

12、ERBY、COMPUTE或或COMPUTEBY子句或子句或INTO关键字。关键字。o(6)不能在视图上定义全文索引定义。不能在视图上定义全文索引定义。o(7)不能创建临时视图,也不能在临时表上创建视图。不能创建临时视图,也不能在临时表上创建视图。o(8)不能对视图执行全文查询,但是如果查询所引用的表支持不能对视图执行全文查询,但是如果查询所引用的表支持全文索引,就可以在视图定义中包含全文查询。全文索引,就可以在视图定义中包含全文查询。o(9)不能将规则或者不能将规则或者DEFAULT定义关联于视图。定义关联于视图。1010.1.2创建视图创建视图o在在SQLServer2005中创建视图主要有

13、两种方式:中创建视图主要有两种方式:o一种方式是在一种方式是在SQLServerManagementStudio中使用中使用向导创建视图;另一种方式是通过在查询窗口中执行向导创建视图;另一种方式是通过在查询窗口中执行T-SQL语句创建视图。语句创建视图。1110.1.2创建视图创建视图o1在在SQLServerManagementStudio中创建视图中创建视图o在在SQLServerManagementStudio使用向导创建视图,是一使用向导创建视图,是一种图形界面环境下最快捷的创建方式,其步骤如下:种图形界面环境下最快捷的创建方式,其步骤如下:o(1)在在“对象资源管理器对象资源管理器”

14、中展开要创建视图的数据库如中展开要创建视图的数据库如“teaching”,展开,展开“视图视图”选项,可以看到视图列表中系统自动选项,可以看到视图列表中系统自动为数据库创建的系统视图。右键单击为数据库创建的系统视图。右键单击“视图视图”选项,选择选项,选择“新建新建视图视图”菜单,打开菜单,打开“添加表添加表”对话框,在此对话框中,可以选择对话框,在此对话框中,可以选择表、视图或者函数,然后单击表、视图或者函数,然后单击“添加添加”按钮,就可以将其添加按钮,就可以将其添加到视图查询中。到视图查询中。 1210.1.2创建视图创建视图o(2)以创建学生表中所有以创建学生表中所有“男男”生信息的视

15、图为例。选择生信息的视图为例。选择“student”表后,单击表后,单击“添加添加”按钮,单击按钮,单击“关闭关闭”按钮,返按钮,返回回“新建视图新建视图”对话框。对话框。o(3)在对话框上半部分,可看到添加进来的在对话框上半部分,可看到添加进来的“student”表,表,选择视图所用的列;在对话框中间网格窗格部分,可看选择视图所用的列;在对话框中间网格窗格部分,可看到在上半部分的复选框中所选择的对应表的列,在到在上半部分的复选框中所选择的对应表的列,在“ssex”列的筛选器中写出筛选条件列的筛选器中写出筛选条件“=男男”;在对话框下半部分,;在对话框下半部分,可看到系统同时生成的可看到系统同

16、时生成的T-SQL语句。然后,单击工具栏语句。然后,单击工具栏上的上的“保存保存”按钮,视图取名为按钮,视图取名为“male_view” 。 1310.1.2创建视图创建视图o2使用使用T-SQL语句创建视图语句创建视图oSQLServer2005提供了提供了CREATEVIEW语句创建视语句创建视图,语法格式如下:图,语法格式如下:oCREATEVIEWschema_name.view_name(column_name,.n)owith,noASselect_statementoWITHCHECKOPTION1410.1.2创建视图创建视图o【例【例10-1】创建】创建“s_c_sc”视图,

17、包括视图,包括“计算机计算机”专业的专业的学生的学号、姓名,和他们选修的课程号、课程名和学生的学号、姓名,和他们选修的课程号、课程名和成绩。成绩。oUSEteachingoGOoCREATEVIEWs_c_scoASoSELECTstudent.sno,sname,o,cname,scoreoFROMstudent,sc,courseWHEREstudent.sno=sc.snooANDo=oANDspecialty=计算机计算机1510.1.2创建视图创建视图o【例【例10-2】创建】创建“inve_count”库存统计视图,求每种商品的总库存统计视图,求每种商品的总库存量,要求包括商品编号

18、和商品名称。库存量,要求包括商品编号和商品名称。oUSEinventoryoGOoCREATEVIEWinve_countoASoSELECTgoods.gno,gname,SUM(number)ASsnumberoFROMgoods,inventoWHEREgoods.gno=invent.gnooGROUPBYgoods.gno,gnameoGO1610.1.3 修改视图修改视图o1在在SQLServerManagementStudio中修改视图中修改视图o2使用使用T-SQL语句修改视图语句修改视图oT-SQL提供了提供了ALTERVIEW语句修改视图,语法格语句修改视图,语法格式如下:

19、式如下:oALTERVIEWschema_name.view_nameo(column_name,.n)withnoASselect_statementoWITHCHECKOPTION1710.1.3 修改视图修改视图o【例【例10-3】修改】修改“inve_count”视图,求每种商品的总库存数量视图,求每种商品的总库存数量和所在仓库的个数,要求包括商品编号和商品名称。和所在仓库的个数,要求包括商品编号和商品名称。oUSEinventoryoGOoALTERVIEWinve_countoASoSELECTgoods.gno,gname,SUM(number)ASsnumber,COUNT(s

20、tno)ASstorenumoFROMgoods,inventoWHEREgoods.gno=invent.gnooGROUPBYgoods.gno,gnameoGO1810.1.3 修改视图修改视图o【例【例10-4】在视图上创建视图:创建】在视图上创建视图:创建“goodscount”商品统计视商品统计视图,求每种商品的总库存数量和和总价值,要求包括商品编图,求每种商品的总库存数量和和总价值,要求包括商品编号和商品名称。号和商品名称。oUSEinventoryoGOoCREATEVIEWgoodscountoASoSELECTgoods.gno,goods.gname,snumber,sn

21、umber*priceassumpriceoFROMgoods,inve_countoWHEREgoods.gno=inve_count.gnooGO1910.1.4 使用视图使用视图o视图创建完毕,就可以如同查询基本表一样通过视图视图创建完毕,就可以如同查询基本表一样通过视图查询所需要的数据,而且有些查询需求的数据直接从查询所需要的数据,而且有些查询需求的数据直接从视图中获取比从基表中获取数据要简单,也可以通过视图中获取比从基表中获取数据要简单,也可以通过视图修改基表中的数据。视图修改基表中的数据。2010.1.4 使用视图使用视图o1使用视图进行数据查询使用视图进行数据查询o可以在可以在S

22、QLServerManagementStudio中选中要查询的中选中要查询的视图并打开,浏览该视图的数据;也可以在查询窗口中视图并打开,浏览该视图的数据;也可以在查询窗口中执行执行T-SQL语句查询视图。语句查询视图。o例如,要查询各种商品的库存统计信息,就可以在例如,要查询各种商品的库存统计信息,就可以在SQLServerManagementStudio中右键单击中右键单击“inve_count”视图,视图,选择选择“打开视图打开视图”选项,即可浏览各种商品的库存统计信选项,即可浏览各种商品的库存统计信息。息。o也可以在查询窗口中执行如下也可以在查询窗口中执行如下T-SQL语句:语句:oSE

23、LECT*FROMinve_count 2110.1.4 使用视图使用视图o【例【例10-5】在查询窗口中查询】在查询窗口中查询s_c_sc视图,统计视图,统计“C+语言语言”课程的总分和平均分。课程的总分和平均分。oUSEteachingoSELECTsumscore=SUM(score),avgscore=AVG(score)FROMs_c_scoWHEREcname=C+语言语言o【例【例10-6】查询】查询“inve_count”视图中视图中“冰箱冰箱”的商品统的商品统计信息。计信息。oUSEinventoryoSELECT*FROMinve_countoWHEREgname=冰箱冰箱

24、2210.1.4 使用视图使用视图o2使用视图修改基本表中数据使用视图修改基本表中数据o修改视图的数据,其实就是对基本表进行修改,真修改视图的数据,其实就是对基本表进行修改,真正插入数据的地方是基本表,而不是视图。同样使用正插入数据的地方是基本表,而不是视图。同样使用INSERT、UPDATE、DELETE语句来完成。但是在语句来完成。但是在对视图进行修改的时候也要注意一些事项,并不是所对视图进行修改的时候也要注意一些事项,并不是所有的视图都可以更新,只有对满足以下可更新条件的有的视图都可以更新,只有对满足以下可更新条件的视图才能进行更新。视图才能进行更新。2310.1.4 使用视图使用视图o

25、(1)任何通过视图的数据修改(包括任何通过视图的数据修改(包括UPDATE、INSERT和和DELETE语句)都只能引用一个基本表的列。语句)都只能引用一个基本表的列。o如果视图数据为一个表的行、列子集,则此视图可更新如果视图数据为一个表的行、列子集,则此视图可更新(包括(包括UPDATE、INSERT和和DELETE语句);但如果视图中语句);但如果视图中没有包含表中某个不允许取空值又没有默认值约束的列,则没有包含表中某个不允许取空值又没有默认值约束的列,则不能利用视图插入数据。不能利用视图插入数据。o如果视图所依赖的基本表有多个时,完全不能向该视图添如果视图所依赖的基本表有多个时,完全不能

26、向该视图添加(加(INSERT)数据。)数据。o若视图依赖于多个基本表,那么一次修改只能修改若视图依赖于多个基本表,那么一次修改只能修改(UPDATE)一个基本表中的数据。)一个基本表中的数据。o若视图依赖于多个基本表,那么不能通过视图删除若视图依赖于多个基本表,那么不能通过视图删除(DELETE)数据。)数据。2410.1.4 使用视图使用视图o(2)视图中被修改的列必须直接引用表列中的基础数视图中被修改的列必须直接引用表列中的基础数据。据。o不能是通过任何其他方式对这些列进行派生而来的数不能是通过任何其他方式对这些列进行派生而来的数据,比如通过聚合函数、计算(如表达式计算)、集据,比如通过

27、聚合函数、计算(如表达式计算)、集合运算等。合运算等。o(3)被修改的列不应是在创建视图时受被修改的列不应是在创建视图时受GROUPBY、HAVING、DISTINCT或或TOP子句影响的。子句影响的。o注意:通常有可能插入并不满足视图查询的注意:通常有可能插入并不满足视图查询的WHERE子句条件中的一行。为了限制此操作,可以在创建视子句条件中的一行。为了限制此操作,可以在创建视图时使用图时使用WITHCHECKOPTION选项。选项。2510.1.4 使用视图使用视图o【例【例10-7】通过】通过“male_view”视图向视图向“student”表中插入一个表中插入一个“男男”生。生。oI

28、NSERTINTOmale_viewVALUES(1501005,张三张三,男男,19)o如果通过如果通过“male_view”视图向视图向“student”表中插入一个表中插入一个“女女”生,生,也可以完成;如果不希望用户通过也可以完成;如果不希望用户通过“male_view”视图插入视图插入“女女”生,在创建生,在创建“male_view”视图时应该使用视图时应该使用WITHCHECKOPTION选项。命令格式如下:选项。命令格式如下:oCREATEVIEWmale_viewASoSELECTsno,sname,ssex,sage,en_time,specialty,gradeoFROMs

29、tudentWHEREssex=男男WITHCHECKOPTION2610.1.5删除视图删除视图o在不需要该视图的时候或想清除视图定义及与之相关在不需要该视图的时候或想清除视图定义及与之相关联的权限时,可以删除该视图。视图的删除不会影响联的权限时,可以删除该视图。视图的删除不会影响所依附的基本表的数据,定义在系统表所依附的基本表的数据,定义在系统表sysahjects、syscolumns、syscomments、sysdepends和和sysprotects中的视图信息也会被删除。中的视图信息也会被删除。o1在在SQLServerManagementStudio删除视图删除视图o在在SQL

30、 Server Management Studio中选中要中选中要删除的视图,右键单击选择删除的视图,右键单击选择“删除删除”命令,如图命令,如图10-13所示;进入所示;进入“删除对象删除对象”窗口,单击窗口,单击“确定确定”按钮就按钮就可以删除视图。可以删除视图。2710.1.5删除视图删除视图o2在查询窗口中执行在查询窗口中执行T-SQL语句删除视图语句删除视图oT-SQL提供了视图删除语句提供了视图删除语句DROPVIEW。o其语法格式如下:其语法格式如下:oDROPVIEWview_name图图10-13删除视图菜单删除视图菜单o【例【例10-8】删除例】删除例10-1创建的创建的s

31、_c_sc视图。视图。oUSEteachingoGOoDROPVIEWs_c_scoGO 2810.2 索引索引o索引索引(Index)是对数据库表中一个或多个列的值进行是对数据库表中一个或多个列的值进行排序的结构,其主要目的是提高排序的结构,其主要目的是提高SQLServer系统的系统的性能,加快数据的查询速度和减少系统的响应时间。性能,加快数据的查询速度和减少系统的响应时间。所以,索引就是加快检索表中数据的方法。所以,索引就是加快检索表中数据的方法。2910.2.1 索引简介索引简介o数据库的索引就类似于书籍的目录,如果想快速查找而数据库的索引就类似于书籍的目录,如果想快速查找而不是逐页查

32、找指定的内容,可以通过目录中章节的页号不是逐页查找指定的内容,可以通过目录中章节的页号找到其对应的内容。类似地,索引通过记录表中的关键找到其对应的内容。类似地,索引通过记录表中的关键值指向表中的记录,这样数据库引擎就不用扫描整个表值指向表中的记录,这样数据库引擎就不用扫描整个表而定位到相关的记录。相反,如果没有索引,则会导致而定位到相关的记录。相反,如果没有索引,则会导致SQLServer搜索表中的所有记录,以获取匹配结果。搜索表中的所有记录,以获取匹配结果。o索引包含从表或视图中一个或多个列生成的键,以及映索引包含从表或视图中一个或多个列生成的键,以及映射到指定数据的存储位置的指针,它是以射

33、到指定数据的存储位置的指针,它是以B+树结构与表树结构与表或视图相关联的。或视图相关联的。3010.2.1 索引简介索引简介o索引的优点包括:索引的优点包括:o(1)大大加快数据的检索速度,这是创建索引的最)大大加快数据的检索速度,这是创建索引的最主要的原因。主要的原因。o(2)创建唯一性索引,保证表中每一行数据的唯一)创建唯一性索引,保证表中每一行数据的唯一性。性。o(3)加速表和表之间的连接。)加速表和表之间的连接。o(4)在使用分组和排序子句进行数据检索时,同样)在使用分组和排序子句进行数据检索时,同样可以显著减少查询中分组和排序的时间。可以显著减少查询中分组和排序的时间。o(5)查询优

34、化器可以提高系统的性能,但它是依靠)查询优化器可以提高系统的性能,但它是依靠索引起作用的。索引起作用的。 3110.2.1 索引简介索引简介o虽然索引具有如此多的优点,但索引的存在也让系统虽然索引具有如此多的优点,但索引的存在也让系统付出了一定的代价。创建索引和维护索引都会消耗时付出了一定的代价。创建索引和维护索引都会消耗时间,当对表中的数据进行增加、删除和修改操作时,间,当对表中的数据进行增加、删除和修改操作时,索引就要进行维护,否则索引的作用就会下降。索引就要进行维护,否则索引的作用就会下降。o另外,每个索引都会占用一定的物理空间,如果占用另外,每个索引都会占用一定的物理空间,如果占用的物

35、理空间过多,就会影响到整个的物理空间过多,就会影响到整个SQLServer系统系统的性能。的性能。3210.2.2 索引类型索引类型oSQLServer2005支持在表中任何列(包括计算列)上定支持在表中任何列(包括计算列)上定义索引。索引可以是唯一的,即索引列不会有两行记录义索引。索引可以是唯一的,即索引列不会有两行记录相同,这样的索引称为唯一索引。例如,如果在表中的相同,这样的索引称为唯一索引。例如,如果在表中的“sname”列上创建了唯一索引,则以后输入的姓名将不能列上创建了唯一索引,则以后输入的姓名将不能同名。索引也可以是不唯一的,即索引列上可以有多行同名。索引也可以是不唯一的,即索引

36、列上可以有多行记录相同。如果索引是根据单列创建的,这样的索引称记录相同。如果索引是根据单列创建的,这样的索引称为单列索引,根据多列组合创建的索引则称为复合索引。为单列索引,根据多列组合创建的索引则称为复合索引。o索引的组织方式的不同,可以将索引分为聚集索引和非索引的组织方式的不同,可以将索引分为聚集索引和非聚集索引。聚集索引。3310.2.2 索引类型索引类型o1.聚集索引聚集索引o聚集索引会对表和视图进行物理排序,所以这种索引聚集索引会对表和视图进行物理排序,所以这种索引对查询非常有效,在表和视图中只能有一个聚集索引。对查询非常有效,在表和视图中只能有一个聚集索引。当建立主键约束时,如果表中

37、没有聚集索引,当建立主键约束时,如果表中没有聚集索引,SQLServer会用主键列作为聚集索引键。可以在表的任何会用主键列作为聚集索引键。可以在表的任何列或列的组合上建立索引,实际应用中一般为定义成列或列的组合上建立索引,实际应用中一般为定义成主键约束的列建立聚集索引。主键约束的列建立聚集索引。o例如,汉语字典的正文就是一个聚集索引的顺序结构。例如,汉语字典的正文就是一个聚集索引的顺序结构。3410.2.2 索引类型索引类型o比如,要查比如,要查“安安”字,就可以翻开字典的前几页,因为字,就可以翻开字典的前几页,因为“安安”的拼音是的拼音是“an”,而按拼音排序字典是以字母,而按拼音排序字典是

38、以字母“a”开头以开头以“z”结尾的,那么结尾的,那么“安安”字就自然地排在字典的字就自然地排在字典的前部。如果翻完了所有前部。如果翻完了所有“an”读音的部分仍然找不到读音的部分仍然找不到这个字,那么就说明字典中没有这个字。这个字,那么就说明字典中没有这个字。o同样,如果查同样,如果查“张张”字,可以将字典翻到最后部分,因字,可以将字典翻到最后部分,因为为“张张”的拼音是的拼音是“zhang”。o也就是说,字典的正文内容本身就是按照音序排列的,也就是说,字典的正文内容本身就是按照音序排列的,而而“汉语拼音音节索引汉语拼音音节索引”就可以称为就可以称为“聚集索引聚集索引”。3510.2.2 索

39、引类型索引类型o2.非聚集索引非聚集索引o非聚集索引不会对表和视图进行物理排序。如果表中不存在非聚集索引不会对表和视图进行物理排序。如果表中不存在聚集索引,则表是未排序的。在表或视图中,最多可以建立聚集索引,则表是未排序的。在表或视图中,最多可以建立250个非聚集索引,或者个非聚集索引,或者249个非聚集索引和个非聚集索引和1个聚集索引。个聚集索引。o例如,查字典时,不认识的字就不能按照上面的方法来查找。例如,查字典时,不认识的字就不能按照上面的方法来查找。o可以根据可以根据“偏旁部首偏旁部首”来查(以下内容因所使用字典不同而异)来查(以下内容因所使用字典不同而异)。比如查。比如查“张张”字,

40、在查部首之后的检字表中字,在查部首之后的检字表中“张张”的页码是的页码是622页,检字表中页,检字表中“张张”的上面是的上面是“弛弛”字,但页码却是字,但页码却是60页,页,“张张”的下面是的下面是“弟弟”字,页码是字,页码是95页,正文中这些字并不是真正的页,正文中这些字并不是真正的分别位于分别位于“张张”字的上下方。字的上下方。3610.2.2 索引类型索引类型o所以,现在看到的连续的所以,现在看到的连续的“弛、张、弟弛、张、弟”三字实际上就三字实际上就是他们在非聚集索引中的排序,是字典正文中的字在是他们在非聚集索引中的排序,是字典正文中的字在非聚集索引中的映射。这种方式来找到所需要的字要

41、非聚集索引中的映射。这种方式来找到所需要的字要两个过程,先找到目录中的结果,然后再翻到所需要两个过程,先找到目录中的结果,然后再翻到所需要的页码。的页码。o这种目录纯粹是目录,正文纯粹是正文的排序方式就这种目录纯粹是目录,正文纯粹是正文的排序方式就称为称为“非聚集索引非聚集索引”。3710.2.2 索引类型索引类型o聚集索引和非聚集索引都可以是唯一的索引。因此,只要列聚集索引和非聚集索引都可以是唯一的索引。因此,只要列中数据是唯一的,就可在同一个表上创建一个唯一的聚集索中数据是唯一的,就可在同一个表上创建一个唯一的聚集索引。如果必须实施唯一性以确保数据的完整性,则应在列上引。如果必须实施唯一性

42、以确保数据的完整性,则应在列上创建创建UNIQUE或或PRIMARYKEY约束,而不要创建唯一索引。约束,而不要创建唯一索引。o创建创建PRIMARYKEY或或UNIQUE约束会在表中指定的列上约束会在表中指定的列上自动创建唯一索引。创建自动创建唯一索引。创建UNIQUE约束与手动创建唯一索引约束与手动创建唯一索引没有明显的区别,进行数据查询时,查询方式相同,而且查没有明显的区别,进行数据查询时,查询方式相同,而且查询优化器不区分唯一索引是由约束创建还是手动创建的。如询优化器不区分唯一索引是由约束创建还是手动创建的。如果存在重复的键值,则无法创建唯一索引和果存在重复的键值,则无法创建唯一索引和

43、PRIMARYKEY或或UNIQUE约束。如果是复合的唯一索引,则该索引可以确约束。如果是复合的唯一索引,则该索引可以确保索引列中每个组合都是唯一的,创建复合唯一索引可为查保索引列中每个组合都是唯一的,创建复合唯一索引可为查询优化器提供附加信息,所以对多列创建复合索引时最好是询优化器提供附加信息,所以对多列创建复合索引时最好是唯一索引。唯一索引。3810.2.3 创建索引创建索引o我们已经知道,创建索引虽然可以提高查询速度,但是它需我们已经知道,创建索引虽然可以提高查询速度,但是它需要牺牲一定的系统性能。要牺牲一定的系统性能。o因此,在创建时,哪些列适合创建索引,哪些列不适合创建因此,在创建时

44、,哪些列适合创建索引,哪些列不适合创建索引,需要进行详细的考察。索引,需要进行详细的考察。o1创建索引时应考虑的问题创建索引时应考虑的问题o(1)对一个表中建大量的索引,应进行权衡。)对一个表中建大量的索引,应进行权衡。o对于对于SELECT查询,大量索引可以提高性能,可以从中选择查询,大量索引可以提高性能,可以从中选择最快的查询方法;但是,会影响最快的查询方法;但是,会影响INSERT、UPDATE和和DELETE语句的性能,因为对表中的数据进行修改时,索引语句的性能,因为对表中的数据进行修改时,索引也要动态的维护,维护索引耗费的时间会随着数据量的增加也要动态的维护,维护索引耗费的时间会随着

45、数据量的增加而增加,所以应避免对经常更新的表建立过多的索引,而对而增加,所以应避免对经常更新的表建立过多的索引,而对更新少而且数据量大的表创建多个索引,可以大大提高查询更新少而且数据量大的表创建多个索引,可以大大提高查询性能。性能。3910.2.3 创建索引创建索引o(2)对于小型表(行数较少)进行索引可能不会产)对于小型表(行数较少)进行索引可能不会产生优化效果。生优化效果。o(3)对于主键和外键列应考虑建索引,因为经常通)对于主键和外键列应考虑建索引,因为经常通过主键查询数据,而外键用于表间的连接。过主键查询数据,而外键用于表间的连接。o(4)很少在查询中使用的列以及值很少的列不应考)很少

46、在查询中使用的列以及值很少的列不应考虑建索引。虑建索引。o(5)视图中如果包含聚集函数或连接时,创建视图)视图中如果包含聚集函数或连接时,创建视图的索引可以显著提升查询性能。的索引可以显著提升查询性能。4010.2.3 创建索引创建索引o2通过通过SQLServerManagementStudio创建索引创建索引o在在SQLServerManagementStudio中使用向导创建索中使用向导创建索引是一种图形界面环境下最快捷的创建方式,其步骤引是一种图形界面环境下最快捷的创建方式,其步骤如下:如下:o(1)在)在SQLServerManagementStudio的的“对象资源对象资源管理器管

47、理器”面板中,选择要创建索引的表面板中,选择要创建索引的表(如如teaching库库中的中的student表表),然后展开,然后展开student表前面的表前面的“+”号,号,选中选中“索引索引”选顶右击,在弹出的快捷菜单中选择选顶右击,在弹出的快捷菜单中选择“新新建索引建索引”命令命令 。4110.2.3 创建索引创建索引o(2)选择)选择“新建索引新建索引”命令,进入命令,进入“新建索引新建索引”窗口。在窗口。在“常规常规”选项窗口中,可以创建索引,在选项窗口中,可以创建索引,在“索引名称索引名称”文本框中输入索文本框中输入索引名称,在引名称,在“索引类型索引类型”下拉列表中选择是不是聚集

48、索引,在下拉列表中选择是不是聚集索引,在“唯一索引唯一索引”单选框中选择是否设置唯一索引等。例如,输入索单选框中选择是否设置唯一索引等。例如,输入索引名称为引名称为“index_sname”,选择,选择“非聚集非聚集”选项。选项。o(3)通过选择索引设置按钮,可以为新建的索引添加、删除、)通过选择索引设置按钮,可以为新建的索引添加、删除、移动索引列。例如,选择移动索引列。例如,选择“添加添加”按钮,进入如图按钮,进入如图10-15所示的所示的“添加索引列添加索引列”窗口,选中窗口,选中“sname”列前的多选按钮,单击列前的多选按钮,单击“确定确定”按钮即可添加一个按按钮即可添加一个按“sna

49、me”列升序排序的非聚集索引。再列升序排序的非聚集索引。再选择选择“确定确定”按钮,索引创建完成。按钮,索引创建完成。4210.2.3 创建索引创建索引o(4)索引创建完成后,在)索引创建完成后,在SQLServerManagementStudio的的“对象资源管理器对象资源管理器”面板中,选择创建了索引面板中,选择创建了索引的表的表(student),展开,展开student表前面的表前面的“+”号,再展开号,再展开“索引索引”选顶前面的选顶前面的“+”号,就会出现新建的索引号,就会出现新建的索引“index_sname” 。4310.2.3 创建索引创建索引o3利用利用T-SQL语句创建索

50、引语句创建索引o语法格式如下:语法格式如下:oCREATEUNIQUECLUSTERED|NONCLUSTEREDINDEXindex_nameoONtable_name|view_name(column_nameASC|DESC,.n)oWITH,.nONfilegroupo:=oPAD_INDEX|FILLFACTOR=fillfactoro|IGNORE_DUP_KEY|DROP_EXISTINGo|STATISTICS_NORECOMPUTE4410.2.3 创建索引创建索引o【例【例10-9】同前例,根据】同前例,根据teaching库中库中student表的姓表的姓名列的升序创建一

51、个名为名列的升序创建一个名为“index_sname”的普通索引,的普通索引,用用T-SQL语句完成。语句完成。oUSEteachingoGOoCREATEINDEXindex_snameONstudent(sname)4510.2.3 创建索引创建索引o【例【例10-10】根据】根据“inventory”库中库中“goods”表的商品名表的商品名称、生产商创建一个名为称、生产商创建一个名为“goods_producer”的唯一性的唯一性复合索引,其中商品名称为升序,生产商为降序。复合索引,其中商品名称为升序,生产商为降序。oUSEinventoryoGOoCREATEUNIQUEINDEXg

52、oods_produceroONgoods(gnameASC,producerDESC)4610.2.3 创建索引创建索引o4间接创建索引间接创建索引o在定义表结构或修改表结构时,如果定义了主键约束在定义表结构或修改表结构时,如果定义了主键约束(PRAMARYKEY)或者唯一性约束()或者唯一性约束(UNIQUE),可以间),可以间接创建索引。接创建索引。o【例【例10-11】创建一个】创建一个“student1”表,并定义了主键约束。表,并定义了主键约束。oUSEteachingoGOoCREATETABLEstudent1(osnochar(6)PRAMARYKEY,osnamechar(

53、8)o此例中,就按此例中,就按sno升序创建了一个聚集索引。升序创建了一个聚集索引。4710.2.3 创建索引创建索引o【例【例10-12】创建一个】创建一个“teacher”教师表,并定义了主教师表,并定义了主键约束和唯一性约束。键约束和唯一性约束。oUSEteachingoGOoCREATETABLEteacher(otnochar(6)PRAMARYKEY,otnamechar(8)UNIQUE)o此例中,创建了两个索引,按此例中,创建了两个索引,按tno升序创建了一个聚升序创建了一个聚集索引,按集索引,按tname升序创建了一个非聚集唯一索引。升序创建了一个非聚集唯一索引。4810.2

54、.3 创建索引创建索引o索引一经创建,就完全由系统自动选择和维护,不需要用户索引一经创建,就完全由系统自动选择和维护,不需要用户指定使用索引,也不需要用户执行打开索引或进行重新索引指定使用索引,也不需要用户执行打开索引或进行重新索引等操作,所有的工作都由等操作,所有的工作都由SQLServer数据库管理系统自动完数据库管理系统自动完成。但对于读者来讲,应该明白为什么要创建这些索引,即成。但对于读者来讲,应该明白为什么要创建这些索引,即这些索引可能在什么情况下被选择使用。例如,这些索引可能在什么情况下被选择使用。例如,student表中表中按姓名列升序创建的按姓名列升序创建的“index_sna

55、me”索引,下面的索引,下面的T-SQL语句语句在执行时系统就可以利用此索引来加快查询速度。在执行时系统就可以利用此索引来加快查询速度。o(1)SELECTsno,specialtyFROMstudentWHEREsname=郑郑丽丽o(2)DELETEFROMstudentWHEREsname=郑丽郑丽4910.2.3 创建索引创建索引o5创建索引视图创建索引视图o视图也称为虚拟表,这是因为由视图返回的结果集其一般格视图也称为虚拟表,这是因为由视图返回的结果集其一般格式与由列和行组成的表相似,并且,在式与由列和行组成的表相似,并且,在SQL语句中引用视图语句中引用视图的方式也与引用表的方式相

56、同。的方式也与引用表的方式相同。o对于标准视图而言,结果集不是永久地存储在数据库中,为对于标准视图而言,结果集不是永久地存储在数据库中,为每个引用视图的查询动态生成结果集的开销很大,特别是对每个引用视图的查询动态生成结果集的开销很大,特别是对于那些涉及对大量行进行复杂处理(如聚合大量数据或连接于那些涉及对大量行进行复杂处理(如聚合大量数据或连接许多行)的视图更为可观。若经常在查询中引用这类视图,许多行)的视图更为可观。若经常在查询中引用这类视图,可通过在视图上创建唯一聚集索引来提高性能。在视图上创可通过在视图上创建唯一聚集索引来提高性能。在视图上创建唯一聚集索引时将执行该视图,并且结果集在数据

57、库中的建唯一聚集索引时将执行该视图,并且结果集在数据库中的存储方式与带聚集索引的表的存储方式相同。存储方式与带聚集索引的表的存储方式相同。5010.2.3 创建索引创建索引o在视图上创建索引的另一个好处是:查询优化器开始在查询中在视图上创建索引的另一个好处是:查询优化器开始在查询中使用视图索引,而不是直接在使用视图索引,而不是直接在FROM子句中命名视图。这样子句中命名视图。这样一来,可从索引视图检索数据而无需重新编码,由此带来的高一来,可从索引视图检索数据而无需重新编码,由此带来的高效率也使现有查询获益。效率也使现有查询获益。o在视图上创建聚集索引可存储创建索引时存在的数据。索引视在视图上创

58、建聚集索引可存储创建索引时存在的数据。索引视图还自动反映自创建索引后对基表数据所做的更改,这一点与图还自动反映自创建索引后对基表数据所做的更改,这一点与在基表上创建的索引相同。当对基表中的数据进行更改时,索在基表上创建的索引相同。当对基表中的数据进行更改时,索引视图中存储的数据也反映数据更改。视图的聚集索引必须唯引视图中存储的数据也反映数据更改。视图的聚集索引必须唯一,从而提高了一,从而提高了SQLServer在索引中查找受任何数据更改影在索引中查找受任何数据更改影响的行的效率。响的行的效率。5110.2.3 创建索引创建索引o与基本表上的索引相比,对索引视图的维护可能更复杂。只与基本表上的索

59、引相比,对索引视图的维护可能更复杂。只有当视图的结果检索速度的效益超过了修改所需的开销时,有当视图的结果检索速度的效益超过了修改所需的开销时,才应在视图上创建索引。这样的视图通常包括映射到相对静才应在视图上创建索引。这样的视图通常包括映射到相对静态的数据上、处理多行以及由许多查询引用的视图。态的数据上、处理多行以及由许多查询引用的视图。o在视图上创建聚集索引之前,该视图必须满足下列要求:在视图上创建聚集索引之前,该视图必须满足下列要求:o(1)当执行当执行CREATEVIEW语句时,语句时,ANSI_NULLS和和QUOTED_IDENTIFIER选项必须设置为选项必须设置为ON。OBJECT

60、PROPERTY函数通过函数通过ExecIsAnsiNullsOn或或ExecIsQuotedIdentOn属性为视图报告此信息。属性为视图报告此信息。o(2)为执行所有为执行所有CREATETABLE语句以创建视图引用的表,语句以创建视图引用的表,ANSI_NULLS选项必须设置为选项必须设置为ON。5210.2.3 创建索引创建索引o(3)视图不能引用任何其它视图,只能引用基本表。视图不能引用任何其它视图,只能引用基本表。o(4)视图引用的所有基本表必须与视图位于同一个数据视图引用的所有基本表必须与视图位于同一个数据库中,并且所有者也与视图相同。库中,并且所有者也与视图相同。o(5)必须使

61、用必须使用SCHEMABINDING选项创建视图。选项创建视图。SCHEMABINDING将视图绑定到基础基本表的架构上。将视图绑定到基础基本表的架构上。o(6)必须已使用必须已使用SCHEMABINDING选项创建了视图中选项创建了视图中引用的用户定义的函数。引用的用户定义的函数。o(7)表和用户定义的函数必须由两部分的名称引用。表和用户定义的函数必须由两部分的名称引用。5310.2.3 创建索引创建索引o (8)IGNOREDUP_KEY:指在使用:指在使用INSERT或或UPDATE命令修改数据且加入相同关键字内容时对操作命令修改数据且加入相同关键字内容时对操作的反应。的反应。o(9)D

62、ROPEXISTING:删除并重新建立原来存在的聚:删除并重新建立原来存在的聚集索引或非聚集索引,新指定的索引名必须与现有的索集索引或非聚集索引,新指定的索引名必须与现有的索引名相同。引名相同。o(10)STATISTICS_NORECOMPUTE:过期的索引统计,:过期的索引统计,不会自动重新计算。不会自动重新计算。o(11)filegroup:在己经创建的文件组上指定索引。:在己经创建的文件组上指定索引。5410.2.3 创建索引创建索引o【例【例10-13】创建一个】创建一个“female_view”女生视图,并为该视图女生视图,并为该视图按按“sno”升序创建一个具有唯一性的聚集索引。

63、升序创建一个具有唯一性的聚集索引。o创建视图:创建视图:oUSEteachingoGOoCREATEVIEWfemale_viewoWITHSCHEMABINDINGoASoSELECTsno,sname,ssex,specialtyFROMdbo.studentoWHEREssex=女女o创建索引:创建索引:oCREATEUNIQUECLUSTEREDINDEXindex_femaleONfemale_view(sno)5510.2.4查看索引信息查看索引信息o在实际使用索引的过程中,有时需要对表的索引信息进行在实际使用索引的过程中,有时需要对表的索引信息进行查询,了解在表中曾经建立的索引。

64、可以使用查询,了解在表中曾经建立的索引。可以使用SQLServerManagementStudio进行查询;也可以在查询窗口中使用进行查询;也可以在查询窗口中使用T-SQL语言句进行查询。语言句进行查询。o1.在在SQLServerManagementStudio中查看索引信息中查看索引信息o在在SQLServerManagementStudio中,选择要查看的表,然中,选择要查看的表,然后使用鼠标右键单击相应的表,从菜单中选择后使用鼠标右键单击相应的表,从菜单中选择“修改修改”,进入,进入“表设计器表设计器”窗口,右键单击任意位置,选择窗口,右键单击任意位置,选择“索引索引/键键”即可即可查

65、看此表上所有的索引信息。查看此表上所有的索引信息。 5610.2.4查看索引信息查看索引信息o2.使用使用T_SQL语句查看索引信息语句查看索引信息o可以使用系统存储过程可以使用系统存储过程sp_helpindex或或sp_help来查来查看索引信息,比如查看看索引信息,比如查看“student”表上的索引信息。表上的索引信息。o(1)使用系统存储过程使用系统存储过程sp_helpindex查看索引信息查看索引信息oUSEteachingoGOoEXECsp_helpindexstudent5710.2.4查看索引信息查看索引信息o2.使用使用T_SQL语句查看索引信息语句查看索引信息o可以使

66、用系统存储过程可以使用系统存储过程sp_helpindex或或sp_help来查看索引信来查看索引信息,比如查看息,比如查看“student”表上的索引信息。表上的索引信息。o(1)使用系统存储过程使用系统存储过程sp_helpindex查看索引信息查看索引信息oUSEteachingoGOoEXECsp_helpindexstudento结果显示了结果显示了“student”表中所建立的两个索引。表中所建立的两个索引。索引名称索引名称为为“index_sname”,索引描述为非聚集索引,索引关键字为,索引描述为非聚集索引,索引关键字为“sname”。索引名称为索引名称为“PK_student

67、”,索引描述为聚集,索引描述为聚集索引、唯一索引,索引关键字为索引、唯一索引,索引关键字为“sno”。5810.2.4查看索引信息查看索引信息o (2)使用系统存储过程使用系统存储过程sp_help查看索引信息查看索引信息oUSEteachingoGOoEXECsp_helpstudento由结果可以看出,执行由结果可以看出,执行sp_help系统存储过程查询的系统存储过程查询的结果要比执行结果要比执行sp_helpindex显示的结果更加详细,显示的结果更加详细,除了索引信息,还包括当前表的基本信息、与此表除了索引信息,还包括当前表的基本信息、与此表相关的各种约束等。相关的各种约束等。59

68、10.2.5 删除索引删除索引o 当一个索引不再需要时,可以将其从数据库中删除,以当一个索引不再需要时,可以将其从数据库中删除,以释放当前占用的存储空间,这些释放的空间可以由数据库中释放当前占用的存储空间,这些释放的空间可以由数据库中的任何对象使用。的任何对象使用。o 删除聚集索引可能要花费一些时间,因为必须重建同一删除聚集索引可能要花费一些时间,因为必须重建同一个表上的所有非聚集索引。必须先删除约束后,才能删除个表上的所有非聚集索引。必须先删除约束后,才能删除PRIMARY KEY或或UNIQUE约束使用的索引。如果要在约束使用的索引。如果要在不删除和重新创建不删除和重新创建PRIMARY

69、KEY或或UNIQUE约束的情约束的情况下,删除并重新创建该约束使用的索引,应该通过一个步况下,删除并重新创建该约束使用的索引,应该通过一个步骤重建该索引。删除某个表时,会自动删除在此表上创建的骤重建该索引。删除某个表时,会自动删除在此表上创建的索引。索引。60 10.2.5 删除索引删除索引o1在在SQLServerManagementStudio中删除索引中删除索引o与在与在SQLServerManagementStudio中创建索引的中创建索引的步骤一样,选中要进行删除索引的表,选中步骤一样,选中要进行删除索引的表,选中“索引索引”选顶,展开选顶,展开“索引索引”选顶前面的选顶前面的“+”号,右键单击要号,右键单击要删除的索引,选择删除的索引,选择“删除删除”按钮,弹出按钮,弹出“删除对象删除对象”对对话框,单击话框,单击“确定确定”按钮。按钮。61 10.2.5 删除索引删除索引o2使用使用T-SQL语句删除索引语句删除索引o删除索引的删除索引的T-SQL语句的语法格式为:语句的语法格式为:oDROPINDEXtable_name.index_nameo【例【例10-14】删除】删除student表中的表中的“Index_sname”索引。索引。oDROPINDEXstudent.Index_snameoGO62

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 医学/心理学 > 基础医学

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号