SQL SERVER 索引(3)——聚集索引

      一、概念

       前边我们介绍过,索引是与表或视图关联的磁盘上结构,可以加快从表或视图中检索行的速度。  聚集索引基于数据行的键值在表内排序和存储这些数据行,对磁盘上实际数据重新组织以按指定的一列或多列值排序,聚集索引的顺序和数据表中数据存储的顺序是一样的。每个表只能有一个聚集索引,因为数据行本身只能按一个顺序存储。举例子就是字典的拼音索引。

       这里引申两个概念,堆表与聚集表。

       没有聚集索引的表称为堆表。堆表的数据列没有任何特别的顺序,连接到表的相邻页面。与访问大的聚集表相比,对标这种无组织的结构通常增大了访问大的堆表的开销。

       有聚集索引的表称为聚集表,聚集表是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

       

       以上是聚集索引的一些内容,欢迎指正。

猜你喜欢

转载自blog.csdn.net/sinat_28984567/article/details/83857191
今日推荐