SQL Sever索引之聚簇索引和非聚簇索引
我們今天是要和大家一起討論的是SQL Sever索引,我們大家都知道表的索引和字典中的索引相似度也別大。它可以極大地提高查詢的速度。對一個較大的表來說,通過加索引,一個通常要花費幾個小時來完成的查詢只要幾分鐘就可以完成。
(對于包含索引的數據庫,SQL Sever需要一個可觀的額外空間。例如,要建立一個聚簇SQL Sever索引,需要大約1.2倍于數據大小的空間。速度是需要付出代價的。)
聚簇索引和非聚簇索引
假設你已經通過字典的索引找到了一個字所在的頁碼。一旦已經知道了頁碼后,你很可能隨機的翻尋字典,直至找到正確的頁碼。這里還有一種找到頁碼的更有效的方法。
首先,把字典翻到大概一半的地方,如果要找的頁碼比半本字典處的頁碼小,就翻到四分之一處,否則,就把書翻到四分之三的地方。通過這種方法,你可以繼續把字典分成更小的部分,直至找到正確的頁碼附近。這是找到書頁的非常有效的一種方法。
(呵呵,到處都是這個例子,跟Hello world有一拼)SQL Sever的表索引以類似的方式工作。一個表SQL Sever索引由一組頁組成,這些頁構成了一個樹形結構。根頁通過指向另外兩個頁,把一個表的記錄從邏輯上分成和兩個部分。而根頁所指向的兩個頁又分別把記錄分割成更小的部分。每個頁都把記錄分成更小的分割,直至到達葉級頁。
索引有兩種類型:聚簇索引和非聚簇索引
在聚簇索引中,索引樹的葉級頁包含實際的數據:記錄的索引順序與物理順序相同。
在非聚簇索引中,葉級頁指向表中的記錄:記錄的物理順序與邏輯順序沒有必然的聯系。
聚簇索引非常象目錄表,目錄表的順序與實際的頁碼順序是一致的。非聚簇索引則更象書的標準SQL Sever索引表,索引表中的順序通常與實際的頁碼順序是不一致的。一本書也許有多個索引。例如,它也許同時有主題索引和作者索引。同樣,一個表可以有多個非聚簇索引。
通常情況下,你使用的是聚簇索引,但是你應該對兩種類型索引的優缺點都有所理解。
每個表只能有一個聚簇索引,因為一個表中的記錄只能以一種物理順序存放。通常你要對一個表按照標識字段建立聚簇索引。但是,你也可以對其它類型的字段建立聚簇索引,如字符型,數值型和日期時間型字段。
從建立了聚簇索引的表中取出數據要比建立了非聚簇索引的表快。當你需要取出一定范圍內的數據時,用聚簇索引也比用非聚簇索引好。例如,假設你用一個表來記錄訪問者在你網點上的活動。如果你想取出在一定時間段內的登錄信息,你應該對這個表的DATETIME型字段建立聚簇索引。
對聚簇索引的主要限制是每個表只能建立一個聚簇索引。但是,一個表可以有不止一個非聚簇SQL Sever索引。實際上,對每個表你最多可以建立249個非聚簇索引。你也可以對一個表同時建立聚簇索引和非聚簇索引。
假如你不僅想根據日期,而且想根據用戶名從你的網點活動日志中取數據。在這種情況下,同時建立一個聚簇索引和非聚簇索引是有效的。你可以對日期時間字段建立聚簇索引,對用戶名字段建立非聚簇索引。如果你發現你需要更多的索引方式,你可以增加更多的非聚簇索引。
非聚簇索引需要大量的硬盤空間和內存。另外,雖然非聚簇索引可以提高從表中 取數據的速度,它也會降低向表中插入和更新數據的速度。每當你改變了一個建立了非聚簇索引的表中的數據時,必須同時更新索引。
因此你對一個表建立非聚簇索引時要慎重考慮。如果你預計一個表需要頻繁地更新數據,那么不要對它建立太多非聚簇索引。另外,如果硬盤和內存空間有限,也應該限制使用非聚簇索引的數量。
索引屬性
這兩種類型的索引都有兩個重要屬性:
你可以用兩者中任一種類型同時對多個字段建立索引(復合SQL Sever索引);
兩種類型的索引都可以指定為唯一索引。
你可以對多個字段建
【編輯推薦】
- SQL Server行轉列的什么情況下被用?
- SQL Server獲取表的容量很簡單!
- SQL Server排序遇到NULL,不怕不帕!
- SQL Server 2005兩種快照隔離機制的不同之處
- SQL Server 2008 FileStream支持“真功夫版”