第十一章索引在日常生活中我们会经常遇到索引,例如图书目录、字典索引等。借助索引,我们会很快地找到需要的东西。例如,当我们要在本书中查找有关“SQL查询"的内容时,应该先通过自录找到“SOL查询所对应的页码,然后从该页码中找出所要的信息。这种方法比直接翻阅书的内容要快。如果把数据库表比作一本书,则表的索引就如书的目录一样,通过索引可大大提高查询速度。索引是数据库检索的常用手段,它实际上就是记录的关键字与其相应地址的对应表。索引的作用可归纳为:1.加快查询速度:2.保证行的唯一性。snosnamessexsbirthdayclass男103陆君950311974-6-3105国明男1975-10-295031107王丽女1976-1-2395033男曾华108950331976-9-1女109王芳9503119752-10男101李军1976-2-2095033例:若要查101学生的信息,要有如下两种方法:方法一:全表扫描方法二:索引Sno索引表(ASC)索引指针地址sno10161031210510731084109511.1索引的分类
109 王芳 女 1975-2-10 95031 101 李军 男 1976-2-20 95033 108 曾华 男 1976-9-1 95033 107 王丽 女 1976-1-23 95033 105 匡明 男 1975-10-2 95031 103 陆君 男 1974-6-3 95031 sno sname ssex sbirthday class 109 王芳 女 1975-2-10 95031 101 李军 男 1976-2-20 95033 108 曾华 男 1976-9-1 95033 107 王丽 女 1976-1-23 95033 105 匡明 男 1975-10-2 95031 103 陆君 男 1974-6-3 95031 sno sname ssex sbirthday class sno索引表(ASC) 索引 sno 指针地址 101 6 103 1 105 2 107 3 108 4 109 5 索引 sno 指针地址 101 6 103 1 105 2 107 3 108 4 109 5 第十一章 索引 在日常生活中我们会经常遇到索引,例如图书目录、字典索引等。借助索引,我们会很 快地找到需要的东西。例如,当我们要在本书中查找有关“SQL 查询”的内容时,应该先通过 目录找到“SQL 查询”所对应的页码,然后从该页码中找出所要的信息。这种方法比直接翻阅 书的内容要快。如果把数据库表比作一本书,则表的索引就如书的目录一样,通过索引可大 大提高查询速度。索引是数据库检索的常用手段,它实际上就是记录的关键字与其相应地址 的对应表。 索引的作用可归纳为: 1. 加快查询速度; 2. 保证行的唯一性。 例:若要查 101 学生的信息,要有如下两种方法: 方法一:全表扫描 方法二:索引 11.1 索引的分类
1. 聚集索引聚集索引改变表记录的物理存储顺序,使之与索引列的顺序完全相同。SQLServer2000是按B树组织聚集索引的,B树的叶节点存放数据页信息。一个表只能有一个聚集索引。sysindexesidindid-1root根节点个下二索引行中间级个下K个索引行索引行索引行叶节点/数据页数据行数据行数据行2.非案集索引非聚簇索引不改变表记录的存放顺序。SQLServer2000也是按B树组织非聚集索引的,与聚集索引不同之处在于:非聚集索引B树的叶节点不存放数据页信息,而是存放非聚集索引的键值,并且每个键值项都有指针指向包含该键值的数据行。sysidindid-oroot根节点个工下索号1行叶节点李1行教据页E
1. 聚集索引 聚集索引改变表记录的物理存储顺序,使之与索引列的顺序完全相同。SQL Server 2000 是按 B 树组织聚集索引的,B 树的叶节点存放数据页信息。 一个表只能有一个聚集索引。 2. 非聚集索引 非聚簇索引不改变表记录的存放顺序。SQL Server 2000 也是按 B 树组织非聚集索引的, 与聚集索引不同之处在于:非聚集索引 B 树的叶节点不存放数据页信息,而是存放非聚集 索引的键值,并且每个键值项都有指针指向包含该键值的数据行
唯一索引的概念唯一索引表示表中每一个索引值只对应唯一的数据记录,当表中有被设置为UNIOUE约束的字段时,SQLServer会自动建立一个非聚簇的唯一索引。而当表中有PRIMARYKEY的字段时,SQLServer会在PRIMARYKEY字段建立一个唯一聚簇索引。11.2系统表sysindexes当用户创建数据库时,系统将自动创建系统表sysindexes,用户创建的每个索引均将在系统表sysindexes中登记字段名宇段类型含义idint表ID(如果indid=0或255)。否则为索引所属表的ID。indid索引ID:smallint1-聚集索引>1=非聚集255=具有text或image数据的表条目表名(如果indid=0或255)。否则为索引namesysname的名称。11.3索引的创建1.通过企业管理器建立索引((1)进入企业管理器,打开school数据库;(2)选择选择student表的图标,右击,出现如图所示的快捷菜单,选择设计表”菜单项,出现所示school的表设计器界面;(3)在xS表设计器界面上选中构成主键的字段"sno”然后点击"主键"图标。(4)为了在student表中按sname建立唯一索引,在设计器界面上右击,出现快捷菜单,选择“索引/键”菜单项,进入属性选项页。student表设计器界面EA长夏北洋空数E
表名(如果 indid = 0 或 255)。否则为索引 的名称。 name sysname 索引 ID: 1 = 聚集索引 >1 = 非聚集 255 = 具有 text 或 image 数据的表条目 indid smallint 表 ID(如果 indid = 0 或 255)。否则为索引 所属表的 ID。 id int 字段名 字段类型 含义 表名(如果 indid = 0 或 255)。否则为索引 的名称。 name sysname 索引 ID: 1 = 聚集索引 >1 = 非聚集 255 = 具有 text 或 image 数据的表条目 indid smallint 表 ID(如果 indid = 0 或 255)。否则为索引 所属表的 ID。 id int 字段名 字段类型 含义 student表设计器界面 唯一索引的概念 唯一索引表示表中每一个索引值只对应唯一的数据记录,当表中有被设置为 UNIQUE 约束的字段时,SQL Server 会自动建立一个非聚簇的唯一索引。而当表中有 PRIMARY KEY 的字段时,SQL Server 会在 PRIMARY KEY 字段建立一个唯一聚簇索引。 11.2 系统表 sysindexes 当用户创建数据库时,系统将自动创建系统表 sysindexes,用户创建的每个索引均将在 系统表 sysindexes 中登记. 11.3 索引的创建 1. 通过企业管理器建立索引 (1) 进入企业管理器,打开 school 数据库; (2) 选择选择 student 表的图标,右击,出现如图所示的快捷菜单,选择“设计表”菜单 项,出现所示 school 的表设计器界面; (3) 在 XS 表设计器界面上选中构成主键的字段“sno” 然后点击“主键”图标。 (4) 为了在 student 表中按 sname 建立唯一索引,在设计器界面上右击,出现快捷菜单, 选择“索引/键”菜单项,进入属性选项页
(5)在“索引/键"属性页选择“新建"命令,然后,系统将自动创建新索引的名称,用户也可自己定义索引名,在“列名”下选择要创建索引的列,在此选择sname这一列,最多可选择16列。索号1/键CHCK约果RE1关系表名student选定的引XL索号!建关型紫名)2U5区昇-PRIMAR?G填充固子@urgue.oA动车-W联利用SQL命令建立索引2.语法格式:CREATE[UNIQUE]/*是否为唯一索引*/[CLUSTERED|NONCLUSTERED]/*索引的组织方式*/INDEXindex_name/*索引名称*/ON (table |view (column [ASC|DESC][,..n])/*指定索引定义依据的对象*//*索引选项*/[WITH<index_option>[,..]][ON filegroup ]/*指定索引文件所在的文件组*/<index_option>=PADINDEX[FILLFACTOR=fillfactorIGNOREDUPKEYIDROPEXISTINGISTATISTICS_NORECOMPUTE例1根据student表的sname列创建唯一非聚集索引。USE schoolIFEXISTS(SELECT*FROMsysindexesWHEREname=IX_sname)DROPINDEXstudent.IX_snameGOCREATEUNIQUENONCLUSTEREDINDEXIX_snameONstudent(sname)例2创建一视图,并为该视图创建索引。IF EXISTS(SELECT * FROM sysobjects WHERE name='VIEW1'AND type='v)DROPVIEWVIEW1GOCREATE VIEWVIEWIWITH SCHEMABINDINGAS
(5) 在“索引/键”属性页选择“新建”命令,然后,系统将自动创建新索引的名称,用 户也可自己定义索引名,在“列名”下选择要创建索引的列,在此选择 sname 这一列,最多可 选择 16 列。 2.利用 SQL 命令建立索引 语法格式: CREATE [ UNIQUE ] /*是否为唯一索引*/ [ CLUSTERED | NONCLUSTERED ] /*索引的组织方式*/ INDEX index_name /*索引名称*/ ON { table | view } ( column [ ASC | DESC ] [ ,.n ] ) /*指定索引定义依据的对象*/ [ WITH < index_option > [ ,.n] ] /*索引选项*/ [ ON filegroup ] /*指定索引文件所在的文件组*/ < index_option > ::= { PAD_INDEX | FILLFACTOR = fillfactor | IGNORE_DUP_KEY | DROP_EXISTING | STATISTICS_NORECOMPUTE 例 1 根据 student 表的 sname 列创建唯一非聚集索引。 USE school IF EXISTS(SELECT * FROM sysindexes WHERE name='IX_sname') DROP INDEX student.IX_sname GO CREATE UNIQUE NONCLUSTERED INDEX IX_sname ON student(sname) 例 2 创建一视图,并为该视图创建索引。 IF EXISTS(SELECT * FROM sysobjects WHERE name='VIEW1' AND type='v') DROP VIEW VIEW1 GO CREATE VIEW VIEW1 WITH SCHEMABINDING AS
SELECTstudent.sno,sname,course.cno,cname,degreeFROM dbo.student,dbo.score,dbo.courseWHERE student.sno=score.sno AND score.cno=course.cnoGOSETANSI_NULLS ONSETANSIPADDINGONSETANSI_WARNINGS ONSETARITHABORT ONSETCONCATNULL_YIELDS NULL ONSETQUOTED_IDENTIFIERONSETNUMERICROUNDABORTOFFIFEXISTS(SELECTnameFROMsysindexesWHEREname-ind1)DROPINDEXVIEW1.indIGOCREATEUNIQUECLUSTEREDINDEXind1ONdbo.VIEW1(sno,cno)11.4索引的删除1.通过企业管理器界面删除索引(1)进入企业管理器,并与指定的数据库相连接:2)为要删除索引的表打开表设计器,在表设计器中右击,然后从快捷菜单中选择“属性”命令:(3)选择"索引/键"选项卡,从“选定的索引"列表中选择要删除的索引,选择“删除"按钮。2.通过SQL命令删除索引语法格式:DROPINDEX'table.index|view.index'[,..n]参数含义:table|view:索引列所在的表或索引视图。Index:要删除的索引名称。n:表示可以指定多个要删除的索引。功能:从当前数据库中删除一个或多个索引
SELECT student.sno,sname,course.cno,cname,degree FROM dbo.student,dbo.score,dbo.course WHERE student.sno=score.sno AND score.cno=course.cno GO SET ANSI_NULLS ON SET ANSI_PADDING ON SET ANSI_WARNINGS ON SET ARITHABORT ON SET CONCAT_NULL_YIELDS_NULL ON SET QUOTED_IDENTIFIER ON SET NUMERIC_ROUNDABORT OFF IF EXISTS(SELECT name FROM sysindexes WHERE name='ind1') DROP INDEX VIEW1.ind1 GO CREATE UNIQUE CLUSTERED INDEX ind1 ON dbo.VIEW1(sno,cno) 11.4 索引的删除 1. 通过企业管理器界面删除索引 (1) 进入企业管理器,并与指定的数据库相连接; (2) 为要删除索引的表打开表设计器,在表设计器中右击,然后从快捷菜单中选择“属性”命 令; (3) 选择“索引/键”选项卡,从“选定的索引”列表中选择要删除的索引,选择“删除”按钮。 2. 通过 SQL 命令删除索引 语法格式: DROP INDEX 'table.index | view.index' [ ,.n ] 参数含义: table | view:索引列所在的表或索引视图。 Index:要删除的索引名称。 n:表示可以指定多个要删除的索引。 功能:从当前数据库中删除一个或多个索引