SQL Server2008儲存結構之物件儲存檢視
SQL Server2008儲存結構之物件儲存檢視
實際上最重要的資料庫物件的儲存結構來之於兩張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頁的地址(檔案號+頁號) |
讓我們還是以例項說話吧
#div_code img { border: 0px none; }
--建立一張包含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
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
#div_code img { border: 0px none; }
--建立一張包含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' --2105058535
SELECT object_id,name,index_id,type,type_desc
FROM SYS.INDEXES WHERE OBJECT_ID=2105058535
SELECT partition_id,object_id,index_id,partition_number,hobt_id,rows
FROM SYS.PARTITIONS WHERE OBJECT_ID=2105058535
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=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
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' --2105058535
SELECT object_id,name,index_id,type,type_desc
FROM SYS.INDEXES WHERE OBJECT_ID=2105058535
SELECT partition_id,object_id,index_id,partition_number,hobt_id,rows
FROM SYS.PARTITIONS WHERE OBJECT_ID=2105058535
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=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
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/6517/viewspace-676505/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- SQL Server2008儲存結構之基本系統檢視SQLServer
- SQL Server2008儲存結構之堆表、行溢位SQLServer
- Redis儲存結構以及儲存格式Redis
- 塊儲存 檔案儲存 物件儲存物件
- 儲存結構
- 儲存—物件儲存_Minio物件
- 檢視和儲存過程相關物件儲存過程物件
- SQL Server 2008儲存結構之PFS結構SQLServer
- SQL Server 2008儲存結構之IAM結構SQLServer
- PostgreSQL儲存引擎之page結構SQL儲存引擎
- MySQL Innodb 儲存結構 & 儲存Null值 解析MySqlNull
- JanusGraph -- 儲存結構
- CentOS 儲存結構CentOS
- 物件儲存物件
- SQL Server 2008儲存結構之GAM、SGAMSQLServerGAM
- SQL Server 2008 儲存結構之DCM、BCMSQLServer
- PostgreSQL儲存引擎之heap tuple結構SQL儲存引擎
- 圖的儲存結構
- 三種儲存結構
- 物件儲存 vs 檔案儲存 vs 塊儲存,選哪個?物件
- MySQL的varchar儲存原理:InnoDB記錄儲存結構MySql
- 物件儲存,未來儲存新潮流物件
- 使用儲存過程(PL/SQL)向資料庫中儲存BLOB物件儲存過程SQL資料庫物件
- 物件儲存、檔案儲存、塊儲存這三者之間有什麼區別?物件
- 線性表之順序儲存結構
- 線性表之鏈式儲存結構
- VSAN儲存結構解析+儲存資料恢復案例資料恢復
- MySQLInnoDB儲存引擎(一):精談innodb的儲存結構MySql儲存引擎
- DAOS 分散式非同步物件儲存|儲存模型分散式非同步物件模型
- 分散式儲存ceph 物件儲存配置zone同步分散式物件
- InnoDB記錄儲存結構
- php圖的儲存結構PHP
- HBase 資料儲存結構
- redis 儲存結構原理 2Redis
- oracle物理儲存結構理解Oracle
- Oracle資料儲存結構Oracle
- SAP儲存地點結構
- 海量非結構化資料儲存難題 ,杉巖資料物件儲存完美解決物件