索引

250 阅读5分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 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个或多个)。

④单击“确定”按钮

image.png

image.png 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、鼠标操作

①展开“索引”节点。

②右击指定索引,选择“属性”。

image.png 2、SQL语句

[EXEC] sp_helpindex [@objname=] name

其中,[@objname=] name是当前数据库中表或视图的名称。

 

例题:

use 学生管理

go 

exec sp_helpindex  学生

image.png

六、索引的重命名

1、鼠标操作

①展开“索引”节点。

②右击指定索引,选择“重命名”。

image.png 2、SQL语句

exec  sp_rename    '表名.索引旧名字','索引新名字'

 

例题:

use 学生管理

go 

exec sp_rename  'dbo.学生.xb','xb_index'

 

七、删除索引

1、鼠标操作

①展开“索引”节点。

②右击指定索引,选择“删除”。

image.png 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

image.png

image.png

九、索引的维护

提供了多种维护索引的方法,常用的有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

image.png 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