程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> SqlServer數據庫 >> 關於SqlServer >> SQL Server2008存儲結構之對象存儲視圖

SQL Server2008存儲結構之對象存儲視圖

編輯:關於SqlServer
實際上最重要的數據庫對象的存儲結構來之於兩張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

1

--創建一張包含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

1
 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved