非叢集索引結構

非叢集索引擁有與叢集索引相同的 B 型樹狀目錄結構,不過有下列顯著的差異:

  • 基礎資料表的資料列並未根據其非叢集索引鍵的順序,進行排序與儲存。

  • 非叢集索引的分葉層是由索引頁 (而不是資料頁) 所組成。

非叢集索引可定義於具有叢集索引或堆積的資料表或檢視中。非叢集索引中的每個索引資料列,都包含非叢集索引鍵值和資料列定位器。這個定位器指向叢集索引或堆積中,擁有此索引鍵值的資料列。

非叢集索引資料列中的資料列定位器是資料列的指標,或資料列的叢集索引鍵,如下所述:

  • 如果資料表為堆積 (表示沒有叢集索引),則資料列定位器為資料列的指標。該指標將以檔案識別碼 (識別碼)、頁碼與分頁中的資料列編號來建立。整個指標也稱為資料列識別碼 (RID)。

  • 如果資料表有叢集索引,或索引位於索引檢視中,則資料列定位器為資料列的叢集索引鍵。如果叢集索引並非唯一的索引,SQL Server 會加入稱為 uniqueifier 之內部產生的值,讓任何重複的索引鍵變成唯一的索引鍵。使用者看不到這個四位元組的值。只有在必須讓叢集索引鍵變成唯一的索引鍵以便在非叢集索引使用時,才會加入此值。SQL Server 藉由使用非叢集索引之分葉資料列所儲存的叢集索引鍵來搜尋叢集索引,以便擷取資料列。

對於索引所使用的每個資料分割,非叢集索引在 sys.partitions 中都有一個 index_id >0 的資料列。根據預設,非叢集索引只有一個資料分割。當非叢集索引有多個資料分割時,每個資料分割都有一個 B 型樹狀目錄結構來包含該特定資料分割的索引資料列。例如,如果非叢集索引有四個資料分割,則共有四個 B 型樹狀目錄結構,每個資料分割中各一個。

視非叢集索引中的資料類型而定,每個非叢集索引結構會有一或多個配置單位來儲存並管理特定資料分割的資料。在每個非叢集索引中,每個資料分割至少會有一個 IN_ROW_DATA 配置單位來儲存索引 B 型樹狀目錄頁面。如果非叢集索引包含大型物件 (LOB) 資料行,則在該非叢集索引中,每個資料分割也會有一個 LOB_DATA 配置單位。此外,如果非叢集索引包含可變長度資料行,而該資料行又超過 8,060 個位元組的資料列大小限制,則每個資料分割也會有一個 ROW_OVERFLOW_DATA 配置單位。如需有關配置單位的詳細資訊,請參閱<資料表與索引組織>。root_page 指標會在 sys.system_internals_allocation_units 系統檢視中錨定 B 型樹狀目錄的分頁集合。

重要事項重要事項

sys.system_internals_allocation_units 系統檢視僅保留給 Microsoft SQL Server 內部使用。我們無法保證未來的相容性。

下圖顯示單一資料分割中非叢集索引的結構。

非叢集索引的層級

內含資料行索引

將內含資料行 (稱為無索引鍵的資料行) 加入至索引的分葉層級,可擴充非叢集索引的功能。索引鍵資料行可儲存在非叢集索引的所有層級,但無索引鍵的資料行只能儲存在分葉層級。如需詳細資訊,請參閱<具有內含資料行的索引>。