一、概念
前边我们介绍过,索引是与表或视图关联的磁盘上结构,可以加快从表或视图中检索行的速度。 聚集索引基于数据行的键值在表内排序和存储这些数据行,对磁盘上实际数据重新组织以按指定的一列或多列值排序,聚集索引的顺序和数据表中数据存储的顺序是一样的。每个表只能有一个聚集索引,因为数据行本身只能按一个顺序存储。举例子就是字典的拼音索引。
这里引申两个概念,堆表与聚集表。
没有聚集索引的表称为堆表。堆表的数据列没有任何特别的顺序,连接到表的相邻页面。与访问大的聚集表相比,对标这种无组织的结构通常增大了访问大的堆表的开销。
有聚集索引的表称为聚集表,聚集表是B树结构,数据量大时,能够大幅减少读次数。
二、聚集索引使用建议
在创建聚集索引之前,应先了解数据是如何被访问的。聚集索引和数据在物理上是按序排列在数据页上的,索引和数据在物理上都是顺序连续的,一旦找到第一个键值的行,后面都将是连在一起,不必在进一步的搜索,避免大范围的扫描,可以提高查询速度。所以考虑对具有以下特点的查询使用聚集索引:
1、使用运算符(如 BETWEEN、>、>=、< 和 <=)返回一系列值。
2、返回大型结果集。
3、使用 JOIN 子句;一般情况下,使用该子句的是外键列。
4、使用 ORDER BY 或 GROUP BY 子句。 在 ORDER BY 或 GROUP BY 子句中指定的列的索引,可以使数据库引擎不必对数据进行排序,因为这些行已经排序。这样可以提高查询性能。
一般情况下,定义聚集索引键时使用的列越少越好。考虑具有下列一个或多个属性的列:
1、唯一或包含许多不重复的值。
2、按顺序被访问。
3、经常用于对表中检索到的数据进行排序。
同时具有以下属性的列,不适合建立聚集索引:
1、频繁更改的列。
2、宽键,若干列或若干大型列的组合。
三、创新索引
语法如下,具体的字段解释内容较多,可以查看官方介绍
Create Relational Index
CREATE [ UNIQUE ] [ CLUSTERED | NONCLUSTERED ] INDEX index_name
ON <object> ( column [ ASC | DESC ] [ ,...n ] )
[ INCLUDE ( column_name [ ,...n ] ) ]
[ WHERE <filter_predicate> ]
[ WITH ( <relational_index_option> [ ,...n ] ) ]
[ ON { partition_scheme_name ( column_name )
| filegroup_name
| default
}
]
[ FILESTREAM_ON { filestream_filegroup_name | partition_scheme_name | "NULL" } ]
[ ; ]
四、具体使用
测试数据,生成了10000条测试数据如下:
--测试数据
if not object_id(N'T') is null
drop table T
Go
Create table T([Id] INT,[Name] nvarchar(22))
DECLARE @index INT
SET @index=0
WHILE(@index<10000)
BEGIN
INSERT INTO T(id,name)VALUES(cast( ceiling(rand()*@index) as int ) ,'测试')
SET @index=@index+1
END
Go
--测试数据结束
在没有索引的情况下,读取结果如下:
DBCC DROPCLEANBUFFERS --删除缓存
DBCC FREEPROCCACHE
Select * from T WHERE Id=151
我们接下来创建聚集索引:
CREATE CLUSTERED INDEX index_name ON T(Id)
在执行同样的sql语句,结果如下:
我们可以看到读取的变化,数据量较少读取速度还不是很明显,如果数据量大会更明显。
最后补充两个知识点,删除索引语句
DROP INDEX index_name ON T --删除索引
查看表索引
sp_helpindex T
以上是聚集索引的一些内容,欢迎指正。