11.1 索引的种类
在SQL Server中,索引和数据是分开存放的。在SQL Server中索引的结构是属于二进制树结构
SQL Server中,索引种类可分为两种:聚集索引及非聚集索引
聚集索引
聚集索引决定了表中的数据实体顺序
因为聚集索引会指出数据在表中的实际存储顺序,所以一个表只能包含一个聚集索引,不过此索引可以包含多个列,就像电话薄按照姓氏与名字分类一样
如果经常以数值氛围来进行数据搜索(如某个月份范围内找出7月份某产品的销售量)时,就可以使用聚集索引来进行搜索数据的工作。此外,如果有一个列常被用来排序从表抽取到的数据,则以该列将表组成聚集可以节省每次查询列后就需进行排序的成本。
当索引值是惟一时,聚集索引对于查找特定的行也很有效,例如,查找员工编号为A01的员工数据最快的方式就是根据员工编号来创建一个聚集索引
非聚集索引
在非聚集索引中,数据存放在一个地方,而索引是存在另外的一个地方,并利用指针指出数据的存储位置
惟一性索引
如果想让表格内的数据在创建索引之后,所查询的数据不要生成重复时,可以创建惟一性数据索引
聚集与非聚集索引都可以是惟一的
复合式索引
指的是在一个表格中,使用一个以上的列来查询数据的索引
自动创建索引
填充因子
填充因子可以让您在创建表格或定义索引时,设置在数据分页或索引分页内数据的添满比例
填充因子值是一个从0到100的百分比,他指定创建好索引之后应填满多少比例的数据页面,如果这个值是100,表示页面是满的,数值愈小,数据页面的空间愈多
这就是为什么当我们添加大笔数据之后或在特定周期之后要执行索引重整的原因
如果您没有指定填充因子时,其默认值为0,但是填充因子值为0时,是表示空间占有率为100%,只会在索引内留下二个空的行
如果使用PAD_INDEX时,填充因子值就不能小于2%,否则会产生错误
索引的限制
在SQL Server中,使用索引时应注意下列事项:
1 仅有表的拥有者可以在相同的表中创建索引
2 每个表只能存在一个聚集索引
3 每个表最多可以创建249个非聚集索引(包括由PRIMARY KEY或UNIQUE条件约束所创建的任何索引)
4 包含索引的所有长度为定值的列的最大长度是900个字节
5 可以包含相同索引的列的最大数目是16
11.2 创建索引
Create Index
范例
创建简单的索引
use pubs
--创建索引auid_inx,并且以authors表格内的au_id来创建索引
Create index auid_inx
ON authors(au_id)
go
使用企业管理器来创建简单式索引
右键表名称--设计表--管理索引/键--属性--索引/键--新建
使用[创建索引向导]来创建索引
工具栏--运行向导--数据库下的创建索引向导--
范例
创建惟一的聚集索引
--创建聚集索引emID_ind
create unique clusteren index emID_ind
on emp_pay(employeeID)
go
范例
使用填充因子
use pubs
go
--创建以au_id字段为为主的索引au_id
create nonclustered index au_ind
on authors(au_id) with fillfactor=100 --设置填充因子为100
go
统计数据索引
Create statistics
范例
--创建name1统计数据组,以便计算Customers表格的CompanyName及ContactName字段5%随机取样的统计数据
Create statistics name1
on customers(companyname,contactname)
with sample 5 percent
go
将索引重新命名
通过企业管理器--设计表--管理索引/键对索引进行重新命名
删除索引
如果您所要删除的索引含有Primary key 以及unique条件约束时,则必须要先删除PRIMARY KEY 或UNIQUE条件约束,否则无法删除索引
DROP INDEX语句删除索引
语法
DROP INDEX 'table.index|view.index'[,..n]
DROP INDEX 并不适用于PRIMARY KEY 或UNIQUE条件约束所创建的索引
DROP INDEX不能在系统表的所以上指定
查阅某个表格或视图目前是否存在索引列表时,使用sp_helpindex存储过程来指定表格或视图名称
范例
--删除在authors表格内的auid_index索引
drop index authors.au_index
go
--查看authors表中包含的索引
sp_helpindex authors
go
使用企业管理器删除索引
设计表--管理索引/键--属性--索引/键--删除
重新建置索引
BREINDEX
范例
DBCC DBREINDEX('pub2.dbo.authors',UPKCL_auid_ind,65)
go
11.3 使用索引优化向导
数据库下的表 表下的索引--查询菜单--索引优化向导