實際上最重要的數據庫對象的存儲結構來之於兩張SQLServer支持的系統視圖,即sys.partitions和sys.allocation_units,還有一張SQLServer尚未公開支持的系統視圖sys.system_internals_allocation_units。
Sys.partitions視圖,數據庫中所有表和索引的每個分區在表中各對應一行;因此可以理解為與sys.indexes為一對多的關系,完全取決於表和索引的分區數。該視圖結構如下:
序號
列名
說明
1
partition_id
分區的 ID。在數據庫中是唯一的。
2
object_id
此分區所屬的對象的 ID。每個表或視圖都至少包含一個分區。
3
index_id
此分區所屬的對象內的索引的 ID。
4
partition_number
所屬索引或堆中的從 1 開始的分區號。對於未分區的表和索引,此列的值為 1。
5
hobt_id
包含此分區的行的數據堆或 B 樹的 ID。
6
rows
此分區中的大約行數。
7
database_fragment_id
標識為僅供參考。不提供支持。不保證以後的兼容性。
8
data_compression
指示每個分區的壓縮狀態:
0 = NONE
1 = ROW
2 = PAGE
9
data_compression_desc
指示每個分區的壓縮狀態。可能的值為 NONE、ROW 和 PAGE
sys.allocation_units視圖,數據庫中的每個分配單元都在表中占一行;一個表可有4種分配單元類型:已刪除、行內數據、LOB數據、行溢出數據,這取決於表的結構和行數據分布情況;同時如sys.partitions視圖所述,表和索引又可能包括若干分區;因此一個表的分配單元數量=表和索引情況*分區數*包含的分配單元類型;sys.allocation_units與sys.partitions也是一對多的關系。
同時分配單元視圖中還包括了該分配單元所分配、已使用和數據使用的頁面數量。
序號
列名
說明
1
allocation_unit_id
分配單元的 ID。在數據庫中是唯一的。
2
type
分配單元的類型:
0 = 已刪除
1 = 行內數據(所有數據類型,但 LOB 數據類型除外)
2 = 大型對象 (LOB) 數據
3 = 行溢出數據
3
type_desc
對分配單元類型的說明:
DROPPED
IN_ROW_DATA
LOB_DATA
ROW_OVERFLOW_DATA
4
container_id
與分配單元關聯的存儲容器的 ID。
如果 type = 1 或 3,
則 container_id = sys.partitions.hobt_id。
如果 type 為 2,
則 container_id = sys.partitions.partition_id。
0 = 標記為要延遲刪除的分配單元
5
data_space_id
該分配單元所在文件組的 ID。
6
total_pages
該分配單元分配或保留的總頁數。
7
used_pages
實際使用的總頁數。
8
data_pages
包含下列數據的已使用頁的數目:
行內數據
LOB 數據
行溢出數據
返回的值排除了內部索引頁和分配管理頁。
9
database_fragment_id
標識為僅供參考。不提供支持。不保證以後的兼容性
sys.system_internals_allocation_units視圖,用法與sys.allocation_units完全一樣,不過在sys.allocation_units的基礎上增加了對分配單元的跟蹤管理的頁面地址信息,關於first_page,root_page,first_iam_page的概念,會在後續的章節中介紹。
序號
列名
說明
1
allocation_unit_id
同sys.allocation_units
2
type
同sys.allocation_units
3
type_desc
同sys.allocation_units
4
container_id
同sys.allocation_units
5
filegroup_id
同sys.allocation_units
6
total_pages
同sys.allocation_units
7
used_pages
同sys.allocation_units
8
data_pages
同sys.allocation_units
9
first_page
首頁的地址(文件號+頁號)
10
root_page
索引根節點的地址(文件號+頁號)
11
first_iam_page
Iam頁的地址(文件號+頁號) 讓我們還是以實例說話吧
--創建一張包含BLOB字段的數據表,同時創建一個聚集索引和非聚集索引,並插入3條記錄
CREATE TABLE test(a INT,b VARCHAR(20),c TEXT);
CREATE UNIQUE CLUSTERED INDEX idx_test ON test(a);
CREATE INDEX ix_test ON test(b);
INSERT INTO test VALUES(1,'a','aaa')INSERT INTO test VALUES(2,'b','bbb')INSERT INTO test VALUES(3,'c','ccc')SELECT * FROM test
--根據表名稱查詢出object_id
SELECT name,object_id,parent_object_id,type_desc
FROM SYS.OBJECTS WHERE NAME='TEST' --2089058478--再查詢相關索引視圖,可以清楚的看到索引視圖中包含兩條索引記錄,即聚集索引和非聚集索引
SELECT object_id,name,index_id,type,type_desc
FROM SYS.INDEXES WHERE OBJECT_ID=2089058478--再查詢相關分區視圖,可以看到分區視圖中包含兩條記錄,即聚集索引和非聚集索引
SELECT partition_id,object_id,index_id,partition_number,hobt_id,rows
FROM SYS.PARTITIONS WHERE OBJECT_ID=2089058478--再查詢分配單元視圖,可以看到分區視圖中包含三條記錄,即聚集索引和非聚集索引以及LOB數據
SELECT allocation_unit_id,type,type_desc,container_id,
data_space_id,total_pages,used_pages,data_pages
FROM
(
SELECT * FROM SYS.ALLOCATION_UNITS U,SYS.PARTITIONS P
WHERE U.TYPE IN (1,3) AND U.CONTAINER_ID=P.HOBT_ID
AND P.OBJECT_ID=2089058478 UNION ALL
SELECT * FROM SYS.ALLOCATION_UNITS U,SYS.PARTITIONS P
WHERE U.TYPE =2 AND U.CONTAINER_ID=P.PARTITION_ID
AND P.OBJECT_ID=2089058478 ) A
--最後再查詢system_internals_allocation_units視圖,可以看到該視圖中與分配單元視圖基本類似,除了多了三個頁面地址
SELECT allocation_unit_id,type,type_desc,container_id,filegroup_id,
total_pages,used_pages,data_pages,
first_page,root_page,first_iam_page
FROM
(
SELECT * FROM sys.system_internals_allocation_units U,SYS.PARTITIONS P
WHERE U.TYPE IN (1,3) AND U.CONTAINER_ID=P.HOBT_ID
AND P.OBJECT_ID=2089058478 UNION ALL
SELECT * FROM sys.system_internals_allocation_units U,SYS.PARTITIONS P
WHERE U.TYPE =2 AND U.CONTAINER_ID=P.PARTITION_ID
AND P.OBJECT_ID=2089058478 ) A
--創建一張包含BLOB字段的數據表
CREATE TABLE heaptest(a INT,b VARCHAR(20),c TEXT);
INSERT INTO heaptest VALUES(1,'a','aaa')INSERT INTO heaptest VALUES(2,'b','bbb')INSERT INTO heaptest VALUES(3,'c','ccc')SELECT * FROM heaptest
SELECT name,object_id,parent_object_id,type_desc
FROM SYS.OBJECTS WHERE NAME='heaptest' --2105058535SELECT object_id,name,index_id,type,type_desc
FROM SYS.INDEXES WHERE OBJECT_ID=2105058535SELECT partition_id,object_id,index_id,partition_number,hobt_id,rows
FROM SYS.PARTITIONS WHERE OBJECT_ID=2105058535SELECT allocation_unit_id,type,type_desc,container_id,
data_space_id,total_pages,used_pages,data_pages
FROM
(
SELECT * FROM SYS.ALLOCATION_UNITS U,SYS.PARTITIONS P
WHERE U.TYPE IN (1,3) AND U.CONTAINER_ID=P.HOBT_ID
AND P.OBJECT_ID=2105058535 UNION ALL
SELECT * FROM SYS.ALLOCATION_UNITS U,SYS.PARTITIONS P
WHERE U.TYPE =2 AND U.CONTAINER_ID=P.PARTITION_ID
AND P.OBJECT_ID=2105058535 ) A
SELECT allocation_unit_id,type,type_desc,container_id,filegroup_id,
total_pages,used_pages,data_pages,
first_page,root_page,first_iam_page
FROM
(
SELECT * FROM sys.system_internals_allocation_units U,SYS.PARTITIONS P
WHERE U.TYPE IN (1,3) AND U.CONTAINER_ID=P.HOBT_ID
AND P.OBJECT_ID=2105058535 UNION ALL
SELECT * FROM sys.system_internals_allocation_units U,SYS.PARTITIONS P
WHERE U.TYPE =2 AND U.CONTAINER_ID=P.PARTITION_ID
AND P.OBJECT_ID=2105058535 ) A