資料表與索引組織

資料表與索引將會儲存為 8 KB 分頁的集合。本主題描述資料表與索引頁面的組織方式。

資料表組織

下圖顯示資料表的組織。資料表是包含在一或多個資料分割中,而且每個資料分割都包含堆積結構或叢集索引結構的資料列。堆積或叢集索引的頁面是依資料列中的資料行類型而定,以一或多個配置單位來管理。

使用資料分割的資料表組織

資料分割

在 SQL Server 2005 中,資料表與索引頁面是包含在一或多個資料分割中。資料分割是使用者自訂的資料組織單位。根據預設,資料表或索引只有一個資料分割,其中包含所有的資料表頁面或是索引頁面。資料分割存在於單一檔案群組中。只有單一資料分割的資料表或索引將相當於舊版的 SQL Server 中資料表與索引的組織結構。

當資料表或索引使用多個資料分割時,會將資料水平分割,這樣資料列的群組就會根據指定的資料行對應至個別的資料分割。資料分割可以放在資料庫的一或多個檔案群組中。在資料上執行查詢或更新時,資料表或索引會被視為單一邏輯實體。如需詳細資訊,請參閱<資料分割資料表與索引>。

若要檢視資料表或索引所使用的資料分割,請使用 sys.partitions (Transact-SQL) 目錄檢視 。

叢集資料表、堆積以及索引

SQL Server 2005 資料表將使用下列兩個方法其中之一在資料分割中組織其資料頁:

  • 叢集資料表為擁有叢集索引的資料表。
    資料列將根據叢集的索引鍵依序儲存。叢集索引將實作成 B 型樹狀索引結構,以根據它們的叢集索引鍵值快速地擷取資料列。索引中每個層級的頁面,包含分葉層級中的資料頁,都是以雙向連結串列的方式連結在一起。然而,導覽不同層級是使用索引鍵值來執行。如需詳細資訊,請參閱<叢集索引結構>。
  • 堆積是沒有叢集索引的資料表。
    資料列並未以特定順序來儲存,並且資料頁也沒有特定順序。資料頁並未連結於連結串列 (Linked List) 中。如需詳細資訊,請參閱<堆積結構>。

索引檢視的儲存結構與叢集資料表一樣。

當堆積或叢集資料表有多個資料分割時,每個資料分割都有堆積或 B 型樹狀目錄結構,其中包含該特定資料分割的資料列群組。例如,如果叢集資料表有四個資料分割,就會有四個 B 型樹狀目錄;每一個資料分割各有一個 B 型樹狀目錄。

非叢集索引

非叢集索引擁有 B 型樹狀目錄索引結構,就和叢集索引的結構類似。其差異為非叢集索引並不會影響資料列的順序。分葉層級包含索引資料列。每個索引資料列都包含非叢集索引鍵值、資料列定位器以及任何內含或無索引鍵的資料行。定位器會指向含有索引鍵值的資料列。如需詳細資訊,請參閱<非叢集索引結構>。

XML 索引

在資料表中的每個 xml 資料行上都可建立一個主要 XML 索引和數個次要 XML 索引。XML 索引是 xml 資料類型資料行中 XML 二進位大型物件 (BLOB) 的零碎和保存的表示法。XML 索引是以內部資料表的方式儲存。若要檢視關於 XML 索引的資訊,請使用 sys.xml_indexessys.internal_tables 目錄檢視。

如需有關 XML 索引的詳細資訊,請參閱<xml 資料類型資料行上的索引>。

配置單位

配置單位是堆積或 B 型樹狀目錄中的頁面集合,根據其頁面類型來管理資料。下表列出在資料表與索引中用來管理資料的配置單位類型。

配置單位類型 用以管理

IN_ROW_DATA

包含所有資料 (除了大型物件 (LOB) 資料之外) 的資料列或索引資料列。

頁面類型是 Data 或 Index。

LOB_DATA

以下列一或多種資料類型儲存的大型物件資料:textntextimagexmlvarchar(max)nvarchar(max)varbinary(max) 或 CLR 使用者自訂類型 (CLR UDT)。

頁面類型是 Text/Image。

ROW_OVERFLOW_DATA

可變長度資料,以超過 8,060 位元組資料列大小限制的 varcharnvarcharvarbinarysql_variant 資料行來儲存。

頁面類型是 Data。

如需頁面類型的詳細資訊,請參閱<頁面與範圍>。

堆積或 B 型樹狀目錄在特定資料分割中每個類型只能有一個配置單位。若要檢視資料表或索引的配置單位資訊,請使用 sys.allocation_units 目錄檢視。

IN_ROW_DATA 配置單位

資料表 (堆積或叢集資料表)、索引或索引檢視所使用的每個資料分割,都有一個 IN_ROW_DATA 配置單位,是由資料頁的集合所組成。此配置單位也包含其他的頁面集合,以實作針對資料表或檢視所定義的每個非叢集索引和 XML 索引。在資料表、索引或索引檢視的每個資料分割中之頁面集合,是由 sys.system_internals_allocation_units 系統檢視的頁面指標所錨定。

ms189051.note(zh-tw,SQL.90).gif重要事項:
sys.system_internals_allocation_units 系統檢視僅用於內部用途,且往後可能變更。我們無法確保其相容性。

結束點所傳回的 WSDL 結果可能包含無效的 XSD 結構描述,例如在下列任一個狀況下匯入一次以上的單一命名空間:容器識別碼與 sys.partitions 目錄檢視中的 partition_id 有一對一的對應,可維護儲存在資料分割中的資料表、索引或索引檢視資料,與用以管理資料分割中資料的配置單位之間的關聯性。

將頁面配置給資料表、索引或索引檢視資料分割,是由 IAM 頁面鏈結所管理。sys.system_internals_allocation_units 中的 first_iam_page 資料行會指向 IAM 頁面鏈結中的第一個 IAM 頁面,IAM 頁面是用以管理配置給 IN_ROW_DATA 配置單位中的資料表、索引或索引檢視的空間。

sys.partitions 會針對資料表或索引中的每個資料分割傳回一個資料列。

  • 每個堆積在 sys.partitions 中都有一個資料列,其 index_id = 0。
    sys.system_internals_allocation_units 中的 first_iam_page 資料行會指向指定資料分割中堆積資料頁集合的 IAM 鏈結。伺服器會使用 IAM 頁面來尋找資料頁集合中的頁面,因為它們並未連結在一起。
  • 資料表或檢視中的叢集索引在 sys.partitions 中有一個資料列,其 index_id = 1。
    sys.system_internals_allocation_units 中的 root_page 資料行會指向指定資料分割中叢集索引 B 型樹狀目錄的最上方。伺服器會使用索引 B 型樹狀目錄來尋找資料分割中的資料頁。
  • 針對資料表或檢視所建立的每個非叢集索引在 sys.partitions 中都有一個資料列,其 index_id > 1。
    sys.system_internals_allocation_units 中的 root_page 資料行會指向指定資料分割中非叢集索引 B 型樹狀目錄的最上方。
  • 擁有至少一個 LOB 資料行的每個資料表在 sys.partitions 中都有一個資料列,其 index_id > 250。
    first_iam_page 資料行會指向 IAM 頁面的鏈結,這些頁面是用以管理 LOB_DATA 配置單位中的頁面。

ROW_OVERFLOW_DATA 配置單位

資料表 (堆積或叢集資料表)、索引或索引檢視所使用的每個資料分割,都有一個 ROW_OVERFLOW_DATA 配置單位。此配置單位包含零 (0) 個頁面,直到 IN_ROW_DATA 配置單位中具有可變長度資料行 (varcharnvarcharvarbinarysql_variant) 的資料列超過 8 KB 資料列大小限制為止。當到達大小限制時,SQL Server 會將具有最大寬度的資料行從該資料列移動到 ROW_OVERFLOW_DATA 配置單位中的某一頁面。在原始頁面上會以 24 位元組的指標指向此移出資料列的資料。

在 ROW_OVERFLOW_DATA 配置單位中的 Text/Image 頁面,是以管理 LOB_DATA 配置單位中的頁面之相同方式來管理。也就是,Text/Image 頁面是以 IAM 頁面的鏈結來管理。

IN_ROW_DATA 配置單位

當資料表或索引具有一或多個 LOB 資料類型時,會配置一個 LOB_DATA 配置單位給每個資料分割,以管理該資料的儲存。LOB 資料類型包含 textntextimagexmlvarchar(max)nvarchar(max)varbinary(max) 以及 CLR 使用者自訂類型。

資料分割與配置單位範例

下列範例會傳回右列兩個資料表的資料分割與配置單位:DatabaseLog,具有 LOB 資料的堆積且沒有非叢集索引,以及 Currency,沒有 LOB 資料的叢集資料表且有一個非叢集索引。兩個資料表都只有一個資料分割。

USE AdventureWorks;
GO
SELECT o.name AS table_name,p.index_id, i.name AS index_name , au.type_desc AS allocation_type, au.data_pages, partition_number
FROM sys.allocation_units AS au
    JOIN sys.partitions AS p ON au.container_id = p.partition_id
    JOIN sys.objects AS o ON p.object_id = o.object_id
    JOIN sys.indexes AS i ON p.index_id = i.index_id AND i.object_id = p.object_id
WHERE o.name = N'DatabaseLog' OR o.name = N'Currency'
ORDER BY o.name, p.index_id;

以下為結果集:(注意這三個值的每一個都是 sql_variant。請注意 DatabaseLog 資料表會使用三個配置單位類型的每一個類型,因為它包含 Data 與 Text/Image 頁面類型。Currency 資料表沒有 LOB 資料,但是擁有管理資料頁所需的配置單位。如果 Currency 資料表是之後才修改以包含 LOB 資料類型資料行,就會建立 LOB_DATA 配置單位來管理該資料。

table_name  index_id index_name               allocation_type     data_pages  partition_number 
----------- -------- -----------------------  ---------------     -----------  ------------
Currency    1        PK_Currency_CurrencyCode IN_ROW_DATA         1           1
Currency    3        AK_Currency_Name         IN_ROW_DATA         1           1
DatabaseLog 0        NULL                     IN_ROW_DATA         160         1
DatabaseLog 0        NULL                     ROW_OVERFLOW_DATA   0           1
DatabaseLog 0        NULL                     LOB_DATA            49          1
(5 row(s) affected)

請參閱

其他資源

sys.allocation_units (Transact-SQL)
sys.partitions (Transact-SQL)
sys.data_spaces (Transact-SQL)

說明及資訊

取得 SQL Server 2005 協助