索引的方法
-- 创建唯一聚集索引 create unique clustered --表示创建唯一聚集索引 index UQ_Clu_StuNo --索引名称 on Student(S_StuNo) --数据表名称(建立索引的列名) with ( pad_index=on, --表示使用填充 fillfactor=50, --表示填充因子为50% ignore_dup_key=on, --表示向唯一索引插入重复值会忽略重复值 statistics_norecompute=off --表示启用统计信息自动更新功能 )
创建唯一非聚集索引:
-- 创建唯一非聚集索引 create unique nonclustered --表示创建唯一非聚集索引 index UQ_NonClu_StuNo --索引名称 on Student(S_StuNo) --数据表名称(建立索引的列名) with ( pad_index=on, --表示使用填充 fillfactor=50, --表示填充因子为50% ignore_dup_key=on, --表示向唯一索引插入重复值会忽略重复值 statistics_norecompute=off --表示启用统计信息自动更新功能 )
--创建聚集索引 create clustered index Clu_Index on Student(S_StuNo) with (drop_existing=on) --创建非聚集索引 create nonclustered index NonClu_Index on Student(S_StuNo) with (drop_existing=on) --创建唯一索引 create unique index NonClu_Index on Student(S_StuNo) with (drop_existing=on)
PS:当 create index 时,如果未指定 clustered 和 nonclustered,那么默认为 nonclustered。
创建非聚集复合索引:
--创建非聚集复合索引 create nonclustered index Index_StuNo_SName on Student(S_StuNo,S_Name) with(drop_existing=on)
--创建非聚集复合索引,未指定默认为非聚集索引 create index Index_StuNo_SName on Student(S_StuNo,S_Name) with(drop_existing=on)
在 CREATE INDEX 语句中使用 INCLUDE 子句,可以在创建索引时定义包含的非键列(即覆盖索引),其语法结构如下:
CREATE NONCLUSTERED INDEX 索引名 ON { 表名| 视图名 } ( 列名 [ ASC | DESC ] [ ,...n ] ) INCLUDE (<列名1>, <列名2>, [,… n])
--创建非聚集覆盖索引 create nonclustered index NonClu_Index on Student(S_StuNo) include (S_Name,S_Height) with(drop_existing=on) --创建非聚集覆盖索引,未指定默认为非聚集索引 create index NonClu_Index on Student(S_StuNo) include (S_Name,S_Height) with(drop_existing=on)
PS:聚集索引不能创建包含非键列的索引。
创建筛选索引:
--创建非聚集筛选索引 create nonclustered index Index_StuNo_SName on Student(S_StuNo) where S_StuNo >= 001 and S_StuNo <= 020 with(drop_existing=on) --创建非聚集筛选索引,未指定默认为非聚集索引 create index Index_StuNo_SName on Student(S_StuNo) where S_StuNo >= 001 and S_StuNo <= 020 with(drop_existing=on)
修改索引:
--修改索引语法 ALTER INDEX { 索引名| ALL } ON <表名|视图名> { REBUILD | DISABLE | REORGANIZE }[ ; ]
REBUILD:表示指定重新生成索引。
DISABLE:表示指定将索引标记为已禁用。
REORGANIZE:表示指定将重新组织的索引叶级。
--禁用名为 NonClu_Index 的索引 alter index NonClu_Index on Student disable
删除和查看索引:
--查看指定表 Student 中的索引 exec sp_helpindex Student --删除指定表 Student 中名为 Index_StuNo_SName 的索引 drop index Student.Index_StuNo_SName --检查表 Student 中索引 UQ_S_StuNo 的碎片信息 dbcc showcontig(Student,UQ_S_StuNo) --整理 Test 数据库中表 Student 的索引 UQ_S_StuNo 的碎片 dbcc indexdefrag(Test,Student,UQ_S_StuNo) --更新表 Student 中的全部索引的统计信息 update statistics Student
索引定义原则:
避免对经常更新的表进行过多的索引,并且索引中的列尽可能少。而对经常用于查询的字段应该创建索引,但要避免添加不必要的字段。
在条件表达式中经常用到的、不同值较多的列上建立索引,在不同值少的列上不要建立索引。
在频繁进行排序或分组(即进行 GROUP BY 或 ORDER BY 操作)的列上建立索引,如果待排序的列有多个,可以在这些列上建立组合索引。
在选择索引键时,尽可能采用小数据类型的列作为键以使每个索引页能容纳尽可能多的索引键和指针,通过这种方式,可使一个查询必需遍历的索引页面降低到最小,此外,尽可能的使用整数做为键值,因为整数的访问速度最快。
参考: