叢集索引和非叢集索引的根本區別是表記錄的排列順序和與索引的排列順序是否一致,
別是表記錄的排列順序和與索引的排列順序是
叢集索引表記錄的排列順序與索引的排列順序一致,優點是查詢速度快,因為一旦具有第一個索引值的紀錄被找到,具有連續索引值的記錄也一定物理的緊跟其後。
叢集索引的缺點是對錶進行修改速度較慢,這是為了保持表中的記錄的物理順序與索引的順序一致,否一致,
叢集索引表記錄的排列順序與索引而把記錄插入到資料頁的相應位置,必須在資料頁中進行資料重排,降低了執行速度。
建議使用叢集索引的場合為:
否一致,
叢集索引表記錄的排列順序與索引 a.此列包含有限數目的不同值;
b.查詢的結果返回一個區間的值;
c.查詢的結果返回某值相同的大量結果集。旦具有第一個索引值的紀錄被找到,具有連續
非叢集索引指定了表中記錄的邏輯順序,但記錄的物理順序和索引的順序不一致,叢集索引和非叢集索引都採用了B+樹的結構,但非叢集索引的葉子層並不與
實際的資料頁相重疊,而採用葉子層包含一個指向表中的記錄在資料頁中的指標的方式。非叢集索引比叢集索引層次多,添加記錄不會引起資料順序的重組。
建議使用非叢集索引的場合為:旦具有第一個索引值的紀錄被找到,具有連續
a.此列包含了大量數目不同的值;
b.查詢的結束返回的是少量的結果集; 叢集索引和非叢集索引的根本區
c.order by 子句中使用了該列。
否一致,
叢集索引表記錄的排列順序與索引
--不用索引查詢
Select * FROM IndexTestTable
WHIT(INDEX(0))別是表記錄的排列順序和與索引的排列順序是
Where Status='B'
--建立叢集索引別是表記錄的排列順序和與索引的排列順序是
Create CLUSTERED INDEX
icIndexTestTable
ON IndexTestTable(Status)的排列順序一致,優點是查詢速度快,因為一
GO
--使用索引查詢 叢集索引和非叢集索引的根本區
Select * FROM IndexTestTable
WITH(INDEX(icIndexTestTable))
Where Status='B'
別是表記錄的排列順序和與索引的排列順序是
別是表記錄的排列順序和與索引的排列順序是
建了索引塊後 尋找的時候首先尋找索引塊 在尋找索引塊中的內容
的排列順序一致,優點是查詢速度快,因為一叢集索引的區別
別是表記錄的排列順序和與索引的排列順序是 叢集索引:實體儲存體按照索引排序
旦具有第一個索引值的紀錄被找到,具有連續 非叢集索引:實體儲存體不按照索引排序
別是表記錄的排列順序和與索引的排列順序是優勢與缺點
叢集索引和非叢集索引的根本區叢集索引:插入資料時速度要慢(時間花費在“實體儲存體的排序”上,也就是首先要找到位置然後插入),查詢資料比非聚集資料的速度快
旦具有第一個索引值的紀錄被找到,具有連續
聚簇索引非常象目錄表,目錄表的順序與實際的頁碼順序是一致的。非聚簇索引則更象書的標準索引表,索引表中的順序通常與實際的頁碼順序是不一致的。一本書也許有多個索引。例如,它也許同時有主題索引和作者索引。同樣,一個表可以有多個非聚簇索引。
叢集索引和非叢集索引的根本區
非聚簇索引需要大量的硬碟空間和記憶體。另外,雖然非聚簇索引可以提高從表中取資料的速度,它也會降低向表中插入和更新資料的速度。每當你改變了一個建立了
非聚簇索引的表中的資料時,必須同時更新索引。因此你對一個表建立非聚簇索引時要謹慎考慮。如果你預計一個表需要頻繁地更新資料,那麼不要對它建立太多非
聚簇索引。另外,如果硬碟和記憶體空間有限,也應該限制使用非聚簇索引的數量。
旦具有第一個索引值的紀錄被找到,具有連續
索引是通過二叉樹的資料結構來描述的,我們可以這麼理解
旦具有第一個索引值的紀錄被找到,具有連續聚簇索引:索引的分葉節點就是資料節點。
而非聚簇索引的分葉節點仍然是索引節點,只不過有一個指標指向對應的資料區塊。
否一致,
叢集索引表記錄的排列順序與索引
如:
叢集索引和非叢集索引的根本區
叢集索引和非叢集索引的根本區
非叢集索引
旦具有第一個索引值的紀錄被找到,具有連續
叢集索引
否一致,
叢集索引表記錄的排列順序與索引
三、聚簇索引與非聚簇索引的本質區別
叢集索引和非叢集索引的根本區
現在可以討論聚簇索引與非聚簇索引的本質區別了。正如本文最前面的兩個圖所示,聚簇索引的分葉節點就是資料節點,而非聚簇索引的頁節點仍然是索引檢點,並保留一個連結指向對應資料區塊。
還是通過一道數學題來看看它們的區別吧:假設有一8000條記錄的表,表中每條記錄在磁碟上佔用1000位元組,如果在一個10位元組長的欄位上建立非聚簇索
引主鍵,需要二叉樹節點16000個(這16000個節點中有8000個分葉節點,每個頁節點都指向一個資料記錄),這樣資料將佔用8000條×1000字
節
/8K位元組=1000個頁面;索引將佔用16000個節點×10位元組/8K位元組=20個頁面,共計1020個頁面。旦具有第一個索引值的紀錄被找到,具有連續
同樣一張表,如果我們在對應欄位上建立聚簇索引主鍵,由於聚簇索引的頁節點就是資料節點,所以索引節點僅有8000個,佔用10個頁面,資料仍然佔有1000個頁面。
旦具有第一個索引值的紀錄被找到,具有連續
下面我們看看在執行插入操作時,非聚簇索引的主鍵為什麼比聚簇索引主鍵要快。主鍵約束要求主鍵不能出現重複,那麼SQL
Server是怎麼知道不出現重複的呢?唯一的方法就是檢索。對於非聚簇索引,只需要檢索20個頁面中的16000個節點就知道是否有重複,因為所有主鍵
索引值在這16000個索引節點中都包含了。但對於聚簇索引,索引節點僅僅包含了8000個中間節點,至於會不會出現重複必須檢索另外8000個頁資料節點
才知道,那麼相當於檢索10+1000=1010個頁面才知道是否有重複。所以聚簇索引主鍵的插入速度要比非聚簇索引主鍵的插入速度慢很多。
讓我們再來看看資料檢索的效率,如果對上述兩表進行檢索,在使用索引的情況下(有些時候SQL
Server執行計畫會選擇不使用索引,不過我們這裡姑且假設一定使用索引),對於聚簇索引檢索,我們可能會訪問10個索引頁面外加1000個資料頁面得
到結果(實際情況要比這個好),而對於非聚簇索引,系統會從20個頁面中找到合格節點,再映射到1000個資料頁面上(這也是最糟糕的情況),比較
一下,一個訪問了1010個頁面而另一個訪問了1020個頁面,可見檢索效率差異並不是很大。所以不管非聚簇索引也好還是聚簇索引也好,都適合排序,聚簇
索引僅僅比非聚簇索引快一點。別是表記錄的排列順序和與索引的排列順序是