SQL Server2008支持在表中任何列(包括计算列)上定义索引,按索引的组 织方式分为聚集索引和非聚集索引。 (1)聚集索引( clustered index) 将数据行的键值在表内排序并存储对应的数据记录,使得数据表物理顺序与 索引顺序一致。(索引中键值的逻辑顺序决定了表中相应行的物理顺序。) 聚集索引确定表中数据的物理顺序,一个表只能包含一个聚集索引,该索引 可以包含多个列(组合索引)。 (2)非聚集索引( nonclustered index) 非聚集索引完全独立于数据行的结构。数据存储在一个位置,索引存储在另 一位置,索引带有指针指向数据的存储位置。 非聚集索引中的项目按索引值的顺序存储,表中的信息按另一种顺序存储。 索引的逻辑顺序与磁盘上的物理存储顺序不同。 一个表中可以有一个或多个非聚集索引
11 SQL Server 2008支持在表中任何列(包括计算列)上定义索引,按索引的组 织方式分为聚集索引和非聚集索引。 (1)聚集索引(clustered index) 将数据行的键值在表内排序并存储对应的数据记录,使得数据表物理顺序与 索引顺序一致。(索引中键值的逻辑顺序决定了表中相应行的物理顺序。) 聚集索引确定表中数据的物理顺序,一个表只能包含一个聚集索引,该索引 可以包含多个列(组合索引)。 (2)非聚集索引(nonclustered index) 非聚集索引完全独立于数据行的结构。数据存储在一个位置,索引存储在另 一位置,索引带有指针指向数据的存储位置。 非聚集索引中的项目按索引值的顺序存储,表中的信息按另一种顺序存储。 索引的逻辑顺序与磁盘上的物理存储顺序不同。 一个表中可以有一个或多个非聚集索引
聚集索引与非聚集索引的区别 聚集索引和非聚集索引的根本区别是表记录的排列顺序和与索引的排列 顺序是否一致 聚集索引表记录的排列顺序与索引的排列顺序一致,查询速度快,对 表进行修改会引起数据顺序的重组,速度较慢。 ·非聚集索引指定了表中记录的逻辑顺序,记录的物理顺序和索引的顺 序不一致,添加记录不会引起数据顺序的重组。 SQL Server默认在主键上建立聚集索引
12 聚集索引与非聚集索引的区别 聚集索引和非聚集索引的根本区别是表记录的排列顺序和与索引的排列 顺序是否一致。 • 聚集索引表记录的排列顺序与索引的排列顺序一致,查询速度快,对 表进行修改会引起数据顺序的重组,速度较慢。 • 非聚集索引指定了表中记录的逻辑顺序,记录的物理顺序和索引的顺 序不一致,添加记录不会引起数据顺序的重组。 • SQL Server默认在主键上建立聚集索引
如何选择聚集索引与非聚集索引 动作描述使用聚集索引 使用非聚集索引 列经常被分组排序 应 返回某范围内的数据应 不应 个或极少不同值 不应 不应 小数目的不同值 不应 大数目的不同值 不应 频繁更新的列不应 外键列 主键列 应应 应应应应应 频繁修改索引列不应
13 如何选择聚集索引与非聚集索引
2、创建索引 CREATE LUNIQUE J /*指定索引是否唯一*/ I CLUSTERED NONCLUSTERED I /*索引的组织方式* INDEX index name /*索引名称* ON< object>( column[ASC|DESC][,n])/*索引定义的依据* EG:为KCB表的课程名列创建索引。 CREATE INDEX kC name ind ON KCB(Cname); EG:根据KCB表的课程号列创建唯一聚集索引。(先将KCB的主键删除) CREATE UNIQUE CLUSTERED INDEX kc id ind ON KCB(C ID) EG:根据CJB表的学号和课程号创建复合索引。 CREATE INDEX CJB ind ON CJB(Stu ID, C ID)
14 2、创建索引 EG:为KCB表的课程名列创建索引。 CREATE INDEX kc_name_ind ON KCB(Cname); EG:根据KCB表的课程号列创建唯一聚集索引。(先将KCB的主键删除) CREATE UNIQUE CLUSTERED INDEX kc_id_ind ON KCB(C_ID); EG:根据CJB表的学号和课程号创建复合索引。 CREATE INDEX CJB_ind ON CJB(Stu_ID,C_ID); CREATE [ UNIQUE ] /*指定索引是否唯一*/ [ CLUSTERED | NONCLUSTERED ] /*索引的组织方式*/ INDEX index_name /*索引名称*/ ON <object> ( column [ ASC | DESC ] [ ,...n ] ) /*索引定义的依据*/
3、删除索引 索引所在的表 DROP INDEX 索引名 名或视图名 index name on table or view name[n I table or view name index name[.n EG:删除表KCB的一个索引名为 kc name ind的索引 IF EXISTS( SELECT name FRoM sysindexes Where name=kc name ind) DROP INDEX KCB. kc name ind EG:删除CJB中名为 CJB ind的索引。 DROP INDEX CJB CJB ind 15
15 3、删除索引 EG:删除表KCB的一个索引名为kc_name_ind的索引。 IF EXISTS(SELECT name FROM sysindexes WHERE name='kc_name_ind') DROP INDEX KCB.kc_name_ind; EG:删除CJB中名为CJB_ind的索引。 DROP INDEX CJB.CJB_ind; DROP INDEX { index_name ON table_or_view_name […n ] | table_or_view_name.index_name […n] } 索引名 索引所在的表 名或视图名