携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第9天
一、索引的意义和代价
提高查询速度,降低更新速度
二、索引的建立原则
l 主键列上一定要建立索引。
l 外键列可以建索引。
l 在经常查询的字段上最好建立索引。
l 对于那些查询中很少涉及的列、重复值比较多的列不要建索引。
l 对于定义为text,Image和Bit数据类型的列上不要建立索引。
三、索引的分类
两类:聚集索引和非聚集索引
聚集索引是指表中数据行的物理存储顺序与索引顺序完全相同。每个表只能创建一个聚集索引。默认情况下,SQL Server为主键约束自动建立聚集索引。
非聚集索引:指定表的逻辑顺序。默认情况下,创建的索引是非聚集索引。
聚集索引
l n 一张表只能有一个聚集索引,并应该第一个建立
l n 聚集索引决定数据的物理存储顺序
l n 主键是聚集索引的良好候选者
l n 索引可以包含多个数据列,但是定义聚集索引键时使用的列越少越好
非聚集索引
l n 非聚集索引指定表的逻辑顺序。数据存储在一个位置,索引存储在另一个位置,索引中包含指向数据存储位置的指针
l n 一个表可以有多个非聚集索引
l n 除非绝对必要,否则不要添加非聚集索引,这是因为非聚集索引需要额外的维护开销
四、索引的创建
1、鼠标步骤
①展开“数据库”节点,展开“表”节点。
②展开指定的表节点,右击“索引”节点,弹出“新建索引”对话框。
③在“索引名称”输入新建索引的名称
④单击“添加”按钮,选择建立索引的相应字段(1个或多个)。
④单击“确定”按钮
2、SQL语句
CREATE[UNIQUE][CLUSTERED|NONCLUSTERED]INDEX索引名
ON {表名|视图名}(列名[ASC|DESC][,…n])
说明:
●[UNIQUE][CLUSTERED|NONCLUSTERED]用来指定创建索引的类型,依次为唯一索引、聚集索引和非聚集索引。当省略UNIQUE选项时,建立的是非唯一索引,省略[CLUSTERED| NONCLUSTERED]选项时,建立的是非聚集索引。
●ASC|DESC用来指定索引列的排序方式,ASC是升序,DESC是降序。如果省略则默认按升序排序。
例题:
use 学生管理
go
create index ix_xb on 学生 (性别)
use 学生管理
go
create unique nonclustered index xy on 学生 (姓名,邮箱)
五、查看索引信息
1、鼠标操作
①展开“索引”节点。
②右击指定索引,选择“属性”。
2、SQL语句
[EXEC] sp_helpindex [@objname=] name
其中,[@objname=] name是当前数据库中表或视图的名称。
例题:
use 学生管理
go
exec sp_helpindex 学生
六、索引的重命名
1、鼠标操作
①展开“索引”节点。
②右击指定索引,选择“重命名”。
2、SQL语句
exec sp_rename '表名.索引旧名字','索引新名字'
例题:
use 学生管理
go
exec sp_rename 'dbo.学生.xb','xb_index'
七、删除索引
1、鼠标操作
①展开“索引”节点。
②右击指定索引,选择“删除”。
2、SQL语句
DROP INDEX 表名.索引名 [,…n]
例题:
drop index 学生.xb
八、索引的分析
SQL Server 2008提供了多种分析索引和查询性能的方法,常用的有SHOWPLAN和STATISTICS IO语句。
1、SHOWPLAN语句
SHOWPLAN语句用来显示查询语句的执行信息,包含查询过程中连接表时所采取的每个步骤以及选择哪个索引。
格式:SETSHOWPLAN_ALL{ON|OFF}和SETSHOWPLAN_TEXT{ON|OFF}
其中,ON为显示查询执行信息,OFF为不显示查询执行信息(系统默认)。
例题:
use 学生管理
go
set SHOWPLAN_ALL on
go
select 学号,姓名,生日
from 学生
where 性别='女'
2、STATISTICS IO语句
STATISTICS IO语句用来显示执行数据检索语句所花费的磁盘活动量信息,可以利用这些信息来确定是否重新设计索引。
格式:SETSTATISTICS IO {ON|OFF}
其中,当STATISTICS IO为ON时,显示统计信息。如果将此选项设置为ON,则所有后续的T-SQL语句将返回统计信息,直到将该选项设置为OFF为止。当STATISTICS IO为OFF时,不显示统计信息。
例题:
use 学生管理
go
set showplan_all off
go
set statistics io on
go
select 学号,姓名,生日
from 学生
where 性别='女'
go
九、索引的维护
提供了多种维护索引的方法,常用的有DBCC SHOWCONTIG和DBCC INDEXDEFRAG语句。
1、DBCC SHOWCONTIG语句
该语句用来显示指定表的数据和索引的碎片信息。当对表进行大量的修改或添加数据之后,应该执行此语句来查看有无碎片。
格式:
DBCCSHOWCONTIG[{table_name|table_id|view_name|view, index_name|index_id}]]
其中,table_name|table_id|view_name|view id是要对其碎片信息进行检查的表或视图。如果未指定任何名称,则对当前数据库中的所有表和索引视图进行检查。
当执行此语句时,重点看其扫描密度,其理想值为100%,如果小于这个值,表示表中已有碎片。如果表中有索引碎片,可以使用DBCC INDEXDEFRAG语句对碎片进行整理。
例题:
USE 学生管理
GO
DBCC SHOWCONTIG
GO
2、DBCC INDEXDEFRAG语句
该语句的作用是整理指定的表或视图的聚集索引和辅助索引的碎片。其语法格式为:
DBCC INDEXDEFRAG
({daabase_name|database_id|0}
,{table_name|table_id|'view_name'|view_id}
,{index_name|index_id})
[WITH NO_INFOMSGS]
其中:
l database_name、database_id|0指对其索引进行碎片整理的数据库。数据库名称必须符合标识符的规则。如果指定0,则使用当前数据库。
l table_name|table_id|’view_name’|view_id指对其索引进行碎片整理的表或视图。
l index_name|index_id是需要进行碎片整理的索引名称。
l WITH NO_INFOMSGS禁止显示所有信息性消息(具有从0~10的严重级别)。
l DBCC INDEXDEFRAG语句对索引的叶级进行碎片整理,以便页的物理顺序与叶结点从左到右的逻辑顺序相匹配,从而提高索引扫描性能。DBCC INDEXDEFRAG语句还用于压缩索引页,并在压缩时考虑创建索引时指定的FILLFACTOR。此压缩所产生的任何空页都将被删除。
例题:
USE 学生管理
GO
DBCC INDEXDEFRAG(学生管理,学生,xb)
GO