SQL SERVER索引分为: 聚集索引和非聚集索引,其中索引再还可以分为唯一索引和非唯一索引。
一、简单介绍
聚集索引:
聚集索引是一种对磁盘上实际数据重新组织以按指定的一列或多列值排序。
如同一本书的目录,我们可以通过目录取查找我们的需要的内容,如果没有目录索引,会需要扫描整本书来查找,效率相比可知建立聚集索引的好处。
一张表只能有一个聚集索引,如果表中含有主键,这个主键默认是张表的聚集索引。
非聚集索引
默认情况下建立的索引是非聚集索引,不重新组织表中的数据,而是对每一行存储索引列值并用一个指针指向数据所在的页面。
如同汉语字典中的根据‘偏旁部首’查找要找的字,即便对数据不排序,然而他拥有的目录更像是目录,对查取数据的效率也是具有的提升空间,而不需要全表扫描。
一个表可以拥有多个非聚集索引,每个非聚集索引根据索引列的不同提供不同的排序顺序。
二、如何建立索引
1.SQL Server管理工具界面可以直接建立索引
2.脚本建立:
CREATE [UNIQUE] [CLUSTERED| NONCLUSTERED ]
INDEX index_name ON { table | view } ( column [ ASC | DESC ] [ ,...n ] )
[with[PAD_INDEX][[,]FILLFACTOR=fillfactor]
[[,]IGNORE_DUP_KEY]
[[,]DROP_EXISTING]
[[,]STATISTICS_NORECOMPUTE]
[[,]SORT_IN_TEMPDB]]
[ ON filegroup ]
--CREATE INDEX命令创建索引各参数说明如下:
--UNIQUE:用于指定为表或视图创建唯一索引,即不允许存在索引值相同的两行。
--CLUSTERED:用于指定创建的索引为聚集索引。
--NONCLUSTERED:用于指定创建的索引为非聚集索引。
--index_name:用于指定所创建的索引的名称。
--table:用于指定创建索引的表的名称。
--view:用于指定创建索引的视图的名称。
--ASC|DESC:用于指定具体某个索引列的升序或降序排序方向。
--Column:用于指定被索引的列。
--PAD_INDEX:用于指定索引中间级中每个页(节点)上保持开放的空间。
--FILLFACTOR = fillfactor:用于指定在创建索引时,每个索引页的数据占索引页大小的百分比,fillfactor的值为1到100。
--IGNORE_DUP_KEY:用于控制当往包含于一个唯一聚集索引中的列中插入重复数据时SQL Server所作的反应。
--DROP_EXISTING:用于指定应删除并重新创建已命名的先前存在的聚集索引或者非聚集索引。
--STATISTICS_NORECOMPUTE:用于指定过期的索引统计不会自动重新计算。
--SORT_IN_TEMPDB:用于指定创建索引时的中间排序结果将存储在 tempdb 数据库中。
--ON filegroup:用于指定存放索引的文件组。
三、查找索引
1.SQL Server管理工具界面可以查找编辑索引
2.脚本查看
--查看索引
Exec sp_helpindex 表名
--修改索引名称
Exec sp_rename '旧名称','新名称'
--删除索引
drop index 表.索引名
--查看索引碎片信息
dbcc showcontig(表,索引名称)
--更新表中的全部索引的统计信息
update statistics 表名
四、建立索引的一些建议
1.创建的列重复值很多如人名建议建立索引,值少如:性别不建议建立索引。
2.建立聚集索引和非聚集索引时最好先建立聚集索引,因为非聚集索引会包含聚集索引键,但先后顺序不会影响到索引最后的性能。
3.尽量选择列较小的作为聚集索引,因为非聚集索引会引用聚集索引,聚集索引列过大会加大非聚集索引列,会影响到性能。
4.用Include索引取代组合索引。
5.对复合索引,按照字段在查询条件中出现的频度建立索引。
6.索引字段上有运算时,保持条件表达式一边是索引原字段,否则索引失效。
7.使用Is Null和Is Not Null时索引会失效,尽量转换其他方式。
8.使用否定方式如<>,!=,Not In索引会失效。
9.使用like模糊查询时,只有前方匹配一致索引有效,如like ‘A%’。
10.使用联合索引时,尽量按照索引的顺序搜索,否则性能会有较小的影响。
11.测试查询性能,检验索引是否生效,下面文章会详细介绍。
欢迎 关注 | CSDN | Github | |
博客园 | 个人网站 | ||
此博客内容是本人在平时工作、学习中,写下这些小总结,其中内容多为初次接触,不能保证完全正确、最优,如有疑问或不足之处,望评论指出。谢谢! |