SQL Server索引

索引(index)是对数据库表的一个或多个列的值进行排序的结构,其主要目的是提高SQL Server系统的性能,加快数据的查询速度和减少系统的响应时间。

所以,索引就算加快检索表中数据的方法。

1. 索引概述

如果要在一本书中快速地查找所需的信息,可以利用目录中给出的章节页码快速地查找到其对应的内容,而不是一页一页地查找。

数据库中的索引1与书籍中的目录类似,也允许数据库应用程序利用索引迅速找到表中特定的数据,而不必扫码整个数据库。

在图书中,目录是内容和相应页码的列表清单。

在数据库中,索引就算表中数据和相应存储位置的列表。

索引是以表的字段列为基础而建立的一种数据库对象,是一种实现数据快速定位与加快数据访问速度的技术手段。

索引通过存储排序的索引关键字与表记录的物理空间位置,建立索引数据与物理数据间的映射关系,从而实现表记录的逻辑排序。

索引的优点如下:

  • 大大加快数据的检索速度,这是创建索引最主要的原因
  • 创建唯一性索引,保证表中每一行数据的唯一性
  • 加速表和表之间的连接
  • 在使用分组和排序子句进行数据检索时,同样可以显著减少查询中分组和排序的时间
  • 查询优化器可以提高系统的性能,但它是依靠索引起作用的

另外,每个索引都会占用一定的物理空间,如果占用的物理空间过多,就会影响到整个SQL Server系统的性能。

2. 索引类型

SQL Server支持在表中任何列(包括计算列)上定义索引。

索引可以是唯一的,即索引列不会有两行记录相同,这样的索引称为唯一索引。

例如,如果在表中的”姓名”列上创建了唯一索引,则以后输入的姓名将不能同名。

索引也可以是不唯一的,即索引列上可以有多行记录相同。

如果索引是根据单列创建的,这样的索引称为单列索引,根据多列组合创建的索引则称为复合索引。

根据索引组织方式的不同,可以将索引分为聚集索引和非聚集索引。

2.1 聚集索引

聚集索引对表和视图进行物理排序,所以这种索引对查询非常有效,在表和视图中只能有一个聚集索引。

当建立主键约束时,如果表中没有聚集索引,SQL Server会用主键列作为聚集索引键。

可以在表的任何列或列的组合上建立索引,实际应用中一般为定义成主键约束的列建立聚集索引。

例如,汉语字段的正文就算一个聚集索引的顺序结构。

要查”大”字,就可以翻开字典的前几页,因为”大”的拼音是da,而按拼音排序字典是以字母a开头以z结尾的,那么”大”字就自然地排在字典的前部。

如果翻完了所有da读音的部分仍然找不到这个字,那么就说明字典中没有这个字。

同样,如果查”赵”字,可以将字典翻到最后部分,因为”赵”的拼音是zhao。

也就是说,字典的正文内容本身就算按照音序排列的,而”汉语拼音音节索引”就可以称为”聚集索引”。

2.2 非聚集索引

非聚集索引不会对表和视图进行物理排序。

如果表中不存在聚集索引,则表是未排序的。

在表或视图中,最多可以建立250个非聚集索引,或者249个非聚集索引和一个聚集索引。

查字典时,不认识的字,就不能按照上面的根据拼音的方法来查找。

可以根据”偏旁部首”来查。

如查”张”字,在查部首之后的检字表中”张”的页码是622页,检字表中”张”的上面是”弛”字,但页码却是60页,”张”的下面是”弟”字,页码是95页,正文中这些字并没有位于”张”字的上、下方。

所以,现在看到的、连续的”弛、张、弟”三字实际上就算它们在非聚集索引中的排序,是字典正文中的字在非聚集索引中的映射。

通过这种方式来找到所需要的字要两个过程,先找到目录中的结果,然后再翻到相应的页码。

这种目录纯粹是目录,正文纯粹是正文的排序方式称为”非聚集索引”。

聚集索引和非聚集索引都可以是唯一的索引。

因此,只要列中数据是唯一的,就可以在同一个表上创建一个唯一的聚集索引。

如果必须实施唯一性以确保数据的完整性,则应在列上创建唯一性或主键约束,而不要创建唯一索引。

创建主键或唯一性约束会在表中指定的列上自动创建唯一索引。

创建唯一性约束与手动创建唯一索引没有明显的区别,进行数据查询时,查询方式相同。

而且查询优化器不区分唯一索引没有明显的区别,进行数据查询时,查询方式相同,而且查询优化器不区分唯一索引是由约束创建还是手动创建的。

如果存在重复的键值,则无法创建唯一索引和主键约束或唯一性约束。

如果是复合的唯一索引,则该索引可以确保索引列中每个组合都是唯一的,创建复合唯一索引可为查询优化器提高附加信息,所以对多列创建复合索引时最好是唯一索引。

3. 创建索引

创建索引的方式主要有3种,分别是使用图形界面创建、使用T-SQL语句创建和间接创建。

3.1 使用图形界面创建索引

(1)在SSMS种点开要创建索引的表的树状结构,找到索引项,如下图所示

(2)右击”索引”项,在弹出的快捷菜单种选择”新建索引”命令,然后选择索引的类型。

进入”新建索引”窗口,如下图:

在”索引名称”文本框中可以输入索引的名称,可以通过勾选”唯一”选项确定是否唯一值索引,单击”添加”按钮,弹出”选择列”对话框,如下图所示:

选择某几列前的复选框,单击”确定”按钮即在这些列上添加了一个索引项,再单击”确定”按钮,索引创建完毕。

3.2 使用T-SQL语句创建索引

语法格式如下。

使用create index语句,既可以创建聚集索引,也可以创建非聚集索引。

它的语法格式如下:

SQL
CREATE [UNIQUE][CLUSTERED][NONCLUSTERED]

INDEX INDEX_NAME

ON TABLE_OR_VIEW_NAME(COLUMN[ASC|DESC][,...n])

其中,各参数说明如下:

  • UNIQUE:用于指定为表或视图创建唯一索引,既不允许存在索引值相同的两行。省略表示非唯一索引。
  • CLUSTERED:用于指定创建的索引为聚集索引。
  • NONCLUSTERED:用于指定创建的索引为非聚集索引,为默认值。
  • INDEX_NAME:索引的名称。索引名称在表或视图中必须唯一,但在数据库中不必唯一。索引名称必须符合标识符的规则。
  • ASC|DESC:用于指定具体某个索引列以升序或降序方式排序。

举例:在student表中,根据年龄的升序和姓名的降序创建一个index_age_name的索引。

SQL
CREATE INDEX index_age_name ON STUDENT(age ASC,name DESC)

运行结果:

3.3 间接创建索引

当表中定义主键约束或唯一性约束时,索引自动被创建了,这种方式可以间接创建索引。

4. 查看索引

查看索引的方式主要有两种,分别是使用图形化界面和使用T-SQL语句。

4.1 使用图形化界面查看索引

利用SSMS选择要查看索引的表,右击打开表的设计界面,进入表的设计器界面,右击任意位置,在弹出的快捷菜单中选择”索引/键”命令,即可看到此表的所有索引信息。

4.2 使用T-SQL语句查看索引

通过系统存储过程来查看索引的信息。

①使用存储过程sp_helpindex查看索引信息

查看student表的索引信息。

SQL
EXEC sp_helpindex STUDENT

运行结果如下:

② 使用存储过程sp_help查看索引信息

查看student表的索引信息

SQL
EXEC sp_help STUDENT

运行结果如下:

从运行结果可以看出,sp_help查询的结果要比sp_helpindex查询的结果更加详细。

5. 删除索引

当一个索引不再需要时,可以将其从数据库中删除,以回收它当前使用的磁盘空间。

根据索引的创建方式,要删除的索引分为两类:

一类为创建表约束时自动创建的索引,必须通过删除主键约束或唯一性约束,才能删除约束使用的索引;

另一类通过创建索引的方式创建的独立于约束的索引,可以利用SSMS工具或drop index语句直接删除。

使用drop index语句删除独立于约束的索引的语法结构如下:

SQL
DROP INDEX 表名,索引名|视图名,索引名[,..n]

例子:删除student表上的index_age_name索引。

SQL
DROP INDEX STUDENT.index_age_name

运行结构如下:

订阅评论
提醒
0 评论
最旧
最新 最多投票
内联反馈
查看所有评论
滚动至顶部