聚集索引和非聚集索引的根本區別
聚集索引和非聚集索引的根本區別是表記錄的排列順序和與索引的排列順序是否一致,聚集索引表記錄的排列順序與索引的排列順序一致,優點是查詢速度快,因為一旦具有第一個索引值的紀錄被找到,具有連續索引值的記錄也一定物理的緊跟其後。
聚集索引的缺點是對表進行修改速度較慢,這是為了保持表中的記錄的物理順序與索引的順序一致,而把記錄插入到數據頁的相應位置,必須在數據頁中進行數據重排,降低了執行速度。建議使用聚集索引的場合為:
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)
--使用索引查詢
Select * FROM IndexTestTable WITH(INDEX(icIndexTestTable)) Where Status='B'
表中經常有一個列或列的組合,其值能唯一地標識表中的每一行。這樣的一列或多列稱為表的主鍵(默認為聚集索引)。聚集索引確定表中數據的物理順序。聚集索引類似於電話簿,後者按姓氏排列數據。由於聚集索引規定數據在表中的物理存儲順序,因此一個表只能包含一個聚集索引。但該索引可以包含多個列(組合索引),就像電話簿按姓氏和名字進行組織一樣。
非聚集索引與課本中的索引類似。數據存儲在一個地方,索引存儲在另一個地方,索引帶有指針指向數據的存儲位置。索引中的項目按索引鍵值的順序存儲,而表中的信息按另一種順序存儲(這可以由聚集索引規定)。如果在表中未創建聚集索引,則無法保證這些行具有任何特定的順序。
聚集索引就像我們新華字典中的按拼音排序,即你查"愛"字可以在前面看到"癌"字,但卻不能在前後頁中看到"受"字。而非聚集索引就是新華字典中的按部首、筆劃排序。聚集索引相當於我們書本上前面的目錄的一樣,它可以方便快速的找到你想找的內容,而非聚集索引就相當於書最後幾頁的解釋,它是對書中某個語句或者是生詞的解釋,就像我們上學時候的地理說一樣,書後面都有各種地理名稱的英文解釋。
《數據庫原理》裡面的解釋:聚集索引的順序就是數據的物理存儲順序,而非聚集索引的順序和數據物理排列無關。因為數據在物理存放時只能有一種排列方式,所以一個表只能有一個聚集索引。
在SQL SERVER中,索引是通過二叉樹的數據結構來描述的;我們可以如此理解這個兩種索引:聚集索引的葉節點就是數據節點,而非聚集索引的葉節點仍然是索引節點,只不過其包含一個指向對應數據塊的指針。
聚集索引會降低 insert,和update操作的性能,所以,是否使用聚集索引要全面衡量。