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
以上是聚集索引的一些內容,歡迎指正。