1. 程式人生 > >SQL SERVER 索引(3)——聚集索引

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 @[email protected]+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

       

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