索引是一个单独的、存储再磁盘上的数据库结构,它包含着对数据表里所有记录的引用指针。使用索引可以快速找出在某个或多个列中有某一特定值的行,建立索引可以加快数据的查询速度。
一.索引的分类
(1)聚集索引
聚集索引基于数据行的键值,在表内排序和存储这些数据行。每个表只能由一个聚集索引,因为数据行本身只能按一个顺序存储。
(2)非聚集索引
非聚集索引具有完全独立于数据行的结构,使用非聚集索引不用将物理数据页中的数据按列排序。非聚集所包含索引键值和指向表数据存储位置的行定位器。
可以对表或索引视图创建多个非聚集索引。
二.创建索引
--语法
--UNIQUE唯一索引,CLUSTERED聚集索引,NOCLUSTERED非聚集索引
--{table|view}选择创建索引的是表还是视图
--column创建索引的列
CREATE [UNIQUE] [CLUSTERED] [NONCLUSTERED]
INDEX index_name ON {table|view}(column [ASC | DESC])
WITH
FILLFACTOR=填充因子
(3)填充因子
用汉语字典作比喻,现在要添加一个字,这个字的拼音叫做“kan”,我们肯定不能加在字典的最后一页,得加在中间,于是字典“kan”以后的字都得往后移,这个工作量的巨大程度可想而知。
如果我们的数据库表没有索引,就不存在填充因子,因为填充因子是针对于索引页的。假如一页可以存储 10 条索引,我们不存储满,只存储 8 条,那么遇到前面的情况,就可以不移动后面的索引,这里不是有 2 条索引的空位么,直接把索引放在这里或者在这一页作些少量的移动就可以了。这就是填充因子,表明一页的填满程度。
那么我们要在这里插入 3 条,是不是要涉及页的移动了,是的,但是这种情况很少发生。在一个表上点右键->设计表->右键->索引/键,我们可以看到,填充因子一项,其中的值默认是 0%,这并不表示不向页中存储任何数据,而是指由 SQL Server 来决定页的填满程度,SQL Server 建议我们使用 0%。如果一个表只读,那么我们可以考虑将填充因子设置为 100%,即不留空。
创建索引时,可以指定一个填充因子,以便在索引的每个叶级页上留出额外的间隙和保留一定百分比的空间,供将来表的数据存储容量进行扩充和减少页拆分的可能性。
对于聚集索引,上面提到的“叶级”,也就是“数据页”,数据页一般比较大,如果不留足一定的空间,每增加一条数据都可能影响其它数据页的移动,性能是很不乐观的。
填充因子的值是 0-100%,0% 表示由系统决定,1% 表示留出的空间最多,100% 表示不留空间。只推荐将只读数据库的填充因子设置为 100%,因为只读数据库的索引不变,不再需要额外的空间来减少页拆分的可能性。平时设置为 0% 即可,这是 SQL Server 推荐的。
可以看出填充因子的目的并不是让页上始终留出那么多的可用空间,该可用空间会随着数据的变动而变动,如果我们重建索引,则会重新分配页,使得每页上的可用空间和刚建立索引时的一样
CREATE CLUSTERED INDEX Idx_job_name
ON employee(e_name,e_job)
WITH FILLFACTOR=50
(4)用系统存储过程查看索引信息
sp_helpindex employee
(5)查看索引的统计信息
DBCC SHOW_STATISTICS('dbo.employee',Idx_job_name)
(6)重命名索引
sp_rename 'employee.Idx_job_ename','Idx_job_name','index'
(7)删除索引
DROP INDEX employee.Idx_job_name