非聚集索引

非聚集索引

非聚集索引是一種索引,該索引中索引的邏輯順序與磁碟上行的物理存儲順序不同。

簡介


非聚集索引

實際應用


漢語字典的正文本身就是一個聚集索引。
比如,我們要查“安”字,就會很自然地翻開字典的前幾頁,因為“安”的拼音是“an”,而按照拼音排序漢字的字典是以英文字母“a”開頭並以“z”結尾的,那麼“安”字就自然地排在字典的前部。如果您翻完了所有以“a”開頭的部分仍然找不到這個字,那麼就說明您的字典中沒有這個字;同樣的,如果查“張”字,那您也會將您的字典翻到最後部分,因為“張”的拼音是“zhang”。也就是說,字典的正文部分本身就是一個目錄,您不需要再去查其他目錄來找到您需要找的內容。正文內容本身就是一種按照一定規則排列的目錄稱為“聚集索引”。每個表只能有一個聚集索引,因為目錄只能按照一種方法進行排序。
非聚集索引與聚集索引一樣有 B 樹結構,但是有兩個重大差別:
數據行不按非聚集索引鍵的順序排序和存儲。非聚集索引的葉層不包含數據頁。相反,葉節點包含索引行。每個索引行包含非聚集鍵值以及一個或多個行定位器,這些行定位器指向有該鍵值的數據行(如果索引不唯一,則可能是多行)。非聚集索引可以在有聚集索引的表、堆集或索引視圖上定義。在 Microsoft® SQL Server™ 2000 中,非聚集索引中的行定位器有兩種形式:
如果表是堆集(沒有聚集索引),行定位器就是指向行的指針。該指針用文件標識符 (ID)、頁碼和頁上的行數生成。整個指針稱為行 ID。如果表有聚集索引,或者索引在索引視圖上,則行定位器就是行的聚集索引鍵。如果聚集索引不是唯一的索引,SQL Server 2000 將添加在內部生成的值以使重複的鍵唯一。用戶看不到這個值,它用於使非聚集索引內的鍵唯一。SQL Server 通過使用聚集索引鍵搜索聚集索引來檢索數據行,而聚集索引鍵存儲在非聚集索引的葉行內。由於非聚集索引將聚集索引鍵作為其行指針存儲,因此使聚集索引鍵儘可能小很重要。如果表還有非聚集索引,請不要選擇大的列作為聚集索引的鍵。