SQL SERVER大話儲存結構(1)_資料頁型別及頁面指令分析

蘇家小蘿蔔發表於2017-05-03
 
 
 


 
    如果轉載,請註明博文來源: www.cnblogs.com/xinysu/   ,版權歸 部落格園 蘇家小蘿蔔 所有。望各位支援!
  


 
    SQLServer的資料頁大小是8kb,8個連續的物理頁組成一個區。區分混合區跟統一區,混合區內可以儲存不同資料庫物件的內容,通常這個資料庫物件較小;統一區表示區內連續的8個資料頁儲存的都是同一個資料庫物件的內容。
 
    SQL SERVER的磁碟讀寫是按頁級進行,每次I/O操作的資料最小單位是以8kb為單位的頁。頁是儲存單位,區是管理單位。
    資料頁根據其儲存內容不同,分為多種型別,本文簡要描述。

1 資料頁的型別

   不同型別的資料,儲存在不同型別的頁面裡,大致可以分為3個方向:儲存實際資料的、儲存管理資料頁資料的及儲存備份相關的資料,這3個反向,又各有不同的page type。詳見下表。
 
Id User_for Page Type Page Name Description
1 實際資料 資料頁 Data Page 堆表或者聚集索引的葉子節點
2 索引頁 Index Page 聚集索引的分支節點或者非聚集索引
3 LOB LOB 用來存放大型物件資料型別:text , image ,varchar(max) , varbinary(max)等
4 行溢位頁 Row Overflow Page 只能儲存單一text或者image列資料塊
5 管理資料頁資料 GAM頁 Global Allocation Map 管理統一區的點陣圖
6 SGAM頁 Shared Global Allocation Map 管理混合區的點陣圖
7 IAM頁 Index Allocation Map 分配單元分配到的區
8 PFS頁 Page Free Space 可用空間
9 備份相關的資料 DCM頁 Differential Changed Map 自最後一條backup database 語句之後更改的區的資訊
10 BCM頁 Bulk Changed Map 自最後一條backup log語句之後的大容量操作所修改的區的資訊
 
    針對備份相關資料的頁面型別,這裡不做詳細描述。儲存實際資料的頁面型別, 後面會有幾篇博文詳細描述。本文重點講解下 儲存 管理資料頁資料 的頁面型別:GAM,SGAM,IAM,PFS 。這塊,對tempdb的效能優化會有比較大的幫助。
    每一個資料檔案的開頭都分佈GAM,SGAM,PFS這些頁面,它們記錄了這個資料庫檔案中哪些頁面已經被使用,哪些頁面還沒有使用。

 

1.1 PFS

      PFS頁,用來跟蹤頁分配級別,儲存當前資料檔案裡所有頁分配及可用空間的資訊,每一個資料檔案的第2個資料頁都是PFS,頁號為1 。該頁面中,每一個位元組描述後面每一個資料頁是否還有空間可以寫記錄,也就是一個PFS頁是8k,約有8k個位元組可以描述後續每個頁面的使用情況,也就是一個PFS頁,可以描述8k個資料頁的使用情況,這就意味著單個PFS頁能夠儲存約64M資料頁的可用空間情況。所以,大約每隔64Mb,就會有一個新的PFS頁。
    每個位元組描述一個資料頁的使用情況,一個位元組有8個bits,分別第0-7位,用途如下:
  • bit 0-2位,描述該頁還有多少空閒空間
    • 0x00 is empty
    • 0x01 is 1 to 50% full
    • 0x02 is 51 to 80% full
    • 0x03 is 81 to 95% full
    • 0x04 is 96 to 100% full
  • bit 3 (0x08): 該資料頁是否存在鬼影記錄(ghost records:http://www.cnblogs.com/lyhabc/archive/2013/06/16/3138214.html)?
  • bit 4 (0x10): 是否是IAM頁?
  • bit 5 (0x20): 是否是混合頁?
  • bit 6 (0x40): 是否已分配使用?
  • Bit 7 保留,未使用,無實際含義

1.2 GAM & SGAM

    SQL SERVER的區分為兩種型別:混合區(uniform extent)跟統一區(mixed extent)。
    混合區,指區內連續的8個資料頁,分別分配給不同的資料庫物件儲存使用,這有利於小表在使用的過程中,沒有一下子就佔據了一個區,而是先從混合區使用,合理分配空間;統一區,指的是區內連續8個頁都是用來儲存同一個資料物件的,當一個表格分配了8個混合區頁後,會開始分配使用統一區,避免資料分散儲存在各個不連續的資料頁中。

1.2.1 GAM

  GAM頁,用來跟蹤區的分配情況,描述每區是否被分配,每個區用1bit標識其分配情況。一個GAM頁8k,一共有8k*8 bit,也就是差不多可以標識 64000個區,約 8k*8bit*(8*8k)=4G 空間,所以,大概每隔 4G空間左右,就有一個GAM頁來標識下一個4G的空間分配情況。
  • Bit=1,標識當前的區是空閒的,可以用來分配;
  • Bit=0,標識當前的區以及被資料使用。
    SQL Server通過讀取GAM頁找到可用空間,並把這個區或者區內的某一個頁分配給一個物件。一個範圍僅儲存一個位元(而不是像PFS頁,PFS是一個頁一個位元組),意味著單個GAM頁能夠追蹤更多空間,在一個資料檔案中,你可以在大約4GB間隔的空間找到一個新GAM頁。然而,資料檔案中的第一個GAM頁的頁碼總是2,因此“2:1:2”就表示tempdb中的第一個GAM頁。

1.2.2 SGAM

    SGAM頁,用來跟蹤區的分配情況,描述哪些區是混合區並且至少有一個空閒的資料頁。1bit描述一個區,1表示該區是混合區且至少有一個空閒的資料頁,代表該區可以分配給需要使用混合區的物件。
    SQL Server通過讀取SGAM頁來找到與可用空間混合的範圍來把空間分配給小物件。單個SGAM頁能夠追蹤4GB的空間,因此,你可以在4GB的間隔中找到它們,就像GAM頁一樣。在資料檔案中,第一個SGAM頁是頁3,所以“2:1:3”就表示tempdb的第一個SGAM頁。
    那麼,這兩種型別的資料頁是如何協助儲存引擎對區進行管理的呢?
  • 當儲存引擎分配一個統一區時,在GAM頁中尋找標記為1的頁面,把標記修改為0,SGAM頁中的標記位不做變動,保持為0;
  • 當儲存引擎分配一個混合區時,在GAM頁中尋找標記為1的頁面,把標記修改為0,SGAM頁中的標記位從0修改1;
  • 當儲存引擎尋找一個有空閒頁的混合區是,直接在SGAM頁中查詢標記位1對應的資料頁;如果沒有找到,則會重新分配一個混合區。

1.2.3 IAM

    區的分配,使用GAM及SGAM管理;頁的使用情況,採用PFS頁管理。那麼,每一個資料庫物件在各個頁裡或者區裡的儲存情況,由誰協助管理呢?答案是 IAM頁。
    一個表格中,IAM頁用來描述資料的分佈情況,基於分配單元來描述。根據實際資料的儲存情況,分為以下3種分配單元:
  • IN_ROW_DATA
    • 儲存堆或索引分割槽,即heap和B-tree。
  • LOB_DATA
    • 儲存大型物件 (LOB) 資料型別,例如 xml、varbinary(max) 和 varchar(max)。
  • ROW_OVERFLOW_DATA
    • 儲存超過 8,060 位元組行大小限制的 varchar、nvarchar、varbinary 或 sql_variant 列中儲存的可變長度資料。

    每個有資料的表格,至少有一個 IAM頁來管理 IN_ROW_DA他的儲存情況,如果表格裡有LOB_DATA,則會多一個IAM頁來管理LOB_DATA,ROW_OVERFLOW_DATA也是一樣。

2 資料頁結構

    資料頁有4個部分:頁頭、行記錄、空閒空間及行偏移量。詳見下圖:
    

2.1 頁頭

佔用96位元組,儲存跟該頁面相關的系統資料。

    頁頭的內容如下:

2.2 行記錄

  • 儲存資料行記錄以及索引資料
  • 行記錄也可以在獨立頁面上儲存,比如行溢位資料即LOB資料

2.3 空閒空間

  • 除去頁頭,行記錄,以及偏移量剩下的空間,提供給行記錄及行偏移量使用

2.4 行偏移量

  • 行偏移是一個個小塊組成的,每個小塊2個位元組,表示資料行從第幾個位元組後開始記錄,也就是距離頁頭多少偏移量開始記錄
  • 儲存方式是從有往左儲存,用槽位來描述,slot 0 ,slot 1 ....
  • 行偏移量記錄的內容是什麼呢?該行記錄從哪個位元組開始,一般情況下,slot 1 從第96個位元組後開始
  • 常說的聚集索引儲存順序是物理排序,指的不是行記錄物理排序,而是行偏移量物理排序,資料頁中,行記錄都是順序往後新增的,通過修改行偏移量來達到聚集索引的順序查詢

3 查詢資料頁儲存格式的途徑

     檢視資料頁儲存方式這裡簡單介紹兩種方式:dbcc page檢視以及dbcc ind檢視,這兩個指令都是非公開的指令,所以msdn上找不到相應的使用說明。不過,還是可以通過 技術內幕的相關資料來查閱分析。
這兩個指令在開啟跟蹤標記2588後可以檢視其引數說明,開啟跟蹤標記3604後,可以把指令執行結果放回到客戶端而不是記錄在錯誤日誌中。

3.1 dbcc ind

3.1.1 語法說明

    檢視ind的引數說明,開啟跟蹤標記2588,help查詢。
 
DBCC TRACEON(2588)
DBCC HELP('ind')
 
DBCC 執行完畢。如果 DBCC 輸出了錯誤資訊,請與系統管理員聯絡。
dbcc IND ( { 'dbname' | dbid }, { 'objname' | objid }, { nonclustered indid | 1 | 0 | -1 | -2 } [, partition_number] )
 
DBCC 執行完畢。如果 DBCC 輸出了錯誤資訊,請與系統管理員聯絡。
 
  輸出的格式有4種方式,不同方式,輸出不一樣。 
  • -2:返回所有IAM頁,基於管理行內資料頁,行溢位資料頁及大物件資料頁的IAM頁
  • -1:返回所有IAM頁及資料頁。
  • 0:返回管理行內資料頁的IAM頁,行內資料頁
  • 1:返回聚集索引的資料頁資訊及IAM頁資訊(同-1)
  • 2:返回第1個非聚集索引的資料頁資訊及IAM頁資訊
  • 3:返回第2個非聚集索引的資料頁資訊及IAM頁資訊
  • ...
  • n:返回第(n-1)個非聚集索引的資料頁資訊及IAM頁資訊(n>1)

 

3.1.2 測試案例

    新建表格,tbpage_c,包含大資料物件及行溢位情況。INSERT一行資料,然後分析。資料庫中,每行資料預設儲存在同一個資料頁,如果一個資料頁儲存不了一行資料,則會出現行溢位情況,具體可自行了解行溢位,所以在這個表格裡邊,設定兩個資料列佔用空間>8k,具體見表SQL如下,造資料的SQL如下。
 
create table tbpage_c(id int identity(1,1) not null primary key ,namea varchar(6000),nameb varchar(3000),descriptions text)
 
#name_a INSERT 6000個字元,name_b INSERT 3000個字元,descriptions INSERT 100個字元
 
INSERT INTO tbpage_c(NAMEA,nameb,descriptions)
select
      substring(stuff((select name+',' from master.dbo.spt_values for xml path('')),1,1,''),1,6000) ,
      substring(stuff((select name+',' from master.dbo.spt_values for xml path('')),1,1,''),1,3000) ,
      substring(stuff((select name+',' from master.dbo.spt_values for xml path('')),1,1,''),1,100)
 

dbcc ind('dbpage','tbpage_c',-2)

選項為-2,顯示錶格的所有IAM頁面。由於表格存在行溢位及大物件列,所以會有其相對應的IAM頁面,故可以看到有3個IAM,分別為 In-row data ,Row-overflow data ,LOB data。

 
 
dbcc ind('dbpage','tbpage_c',-1)
選項為-1,返回所有IAM頁及資料頁。
  • 資料頁號310,309屬於 In-row data 型別。309記錄實際資料,310記錄In-row data實際資料頁的分佈情況。
  • 資料頁號307,308屬於 Row-overflow data 型別。307記錄實際資料,308記錄 Row-overflow data 實際資料頁的分佈情況。
  • 資料頁號305,306屬於 LOB data 型別。305記錄實際資料,306記錄 LOB data  實際資料頁的分佈情況。
 

 

dbcc ind('dbpage','tbpage_c',0)
選項為0,返回管理行內資料頁的IAM頁,行內資料頁,故此處僅返回 In-row data 相關資料頁。
 

 

dbcc ind('dbpage','tbpage_c',1)
選項為1,返回聚集索引涉及到所有IAM頁及資料頁。
 

3.2 dbcc page

3.2.1 語法說明

    檢視page的引數說明,開啟跟蹤標記2588,help查詢。
 
DBCC TRACEON(2588)
DBCC HELP('PAGE')
 
DBCC 執行完畢。如果 DBCC 輸出了錯誤資訊,請與系統管理員聯絡。
dbcc PAGE ( {'dbname' | dbid}, filenum, pagenum [, printopt={0|1|2|3} ])
 
DBCC 執行完畢。如果 DBCC 輸出了錯誤資訊,請與系統管理員聯絡
    輸出的格式有4種方式,不同方式,輸出不一樣。
  • 0:輸出可讀形式的資料頁頁頭資料
  • 1:輸出可讀形式的資料頁頁頭資料,並且還有槽位對應記錄的十六進位制內容
  • 2:輸出可讀形式的資料頁頁頭資料,輸出整個資料頁頁頭的十六進位制資料,整一頁的內容都顯示,包括未使用的空間。
  • 3:輸出可讀形式的資料頁頁頭資料,並且包括記錄中每個欄位的可讀形式,行溢位資料也會顯示資料內容,但是大物件則不顯示內容,而是說明其儲存位置!所以選項3,也是輸出內容最全面的。

3.2.2 測試案例

    採用3.1.2的表格,分析其 IN_ROW DA他的資料頁面,page_id=309 。
    本次測試,沒有采用 with tableresults分析,如果dbcc page('dbpage',1,309,0) with tableresults,結果則是已表格形式返回,可以提供後期管理分析用。
    選項為0,輸出可讀格式的資料頁 頁頭資料。
 
DBCC TRACEON(3604)
dbcc
page('dbpage',1,309,0) ---------------------------------------------------------------------------------------------------------- PAGE: (1:309) BUFFER: BUF @0x000000027C0827C0 bpage = 0x000000026FA86000 bhash = 0x0000000000000000 bpageno = (1:309) bdbid = 10 breferences = 0 bcputicks = 0 bsampleCount = 0 bUse1 = 46781 bstat = 0xb blog = 0x212121cc bnext = 0x0000000000000000 PAGE HEADER: Page @0x000000026FA86000 m_pageId = (1:309) m_headerVersion = 1 m_type = 1 /* m_pageId 當前頁面號碼;m_headerVersion 版本號,始終為1;m_type 頁面資料型別,1為資料頁面,10為IAM頁面等,具體參考pagetype */ m_typeFlagBits = 0x0 m_level = 0 m_flagBits = 0xc000 /* m_typeFlagBits 資料頁和索引頁為4,其他頁為0 m_level 該頁在索引頁(B樹)中的級數,0表示為葉子節點 m_flagBits 頁面標誌 */ m_objId (AllocUnitId.idObj) = 35 m_indexId (AllocUnitId.idInd) = 256 /* m_indexId (AllocUnitId.idInd) 索引ID,0 代表堆, 1 代表聚集索引, 2-250 代表非聚集索引 大於250就是text或image欄位 */ Metadata: AllocUnitId = 72057594040221696 Metadata: PartitionId = 72057594038976512 Metadata: IndexId = 1 Metadata: ObjectId = 341576255 m_prevPage = (0:0) m_nextPage = (0:0) /* Metadata: AllocUnitId 儲存單元的ID,sys.allocation_units.allocation_unit_id Metadata: PartitionId 資料頁所在的分割槽號,sys.partitions.partition_id Metadata: ObjectId 該頁面所屬的物件的id,sys.objects.object_id Metadata: IndexId sys.objects.object_id&sys.indexes.index_id m_prevPage 該資料頁的前一頁面 m_nextPage 該資料頁的後一頁面 */ pminlen = 8 m_slotCnt = 1 m_freeCnt = 5035 m_freeData = 3155 m_reservedCnt = 0 m_lsn = (39:400:68) m_xactReserved = 0 m_xdesId = (0:0) m_ghostRecCnt = 0 m_tornBits = 0 DB Frag ID = 1 /* pminlen 定長資料所佔的位元組數為多少個位元組 m_slotCnt 頁面中的資料的行數 m_freeCnt 頁面中剩餘的空間,還剩多少位元組的空間 m_freeData 頁面空閒空間的起始位置,一個頁面8KB約等於8192位元組 頁面空閒空間的位置在3155 m_reservedCnt 活動事務釋放的位元組數 m_lsn 日誌記錄號 m_xactReserved 最新加入到m_reservedCnt領域的位元組數 m_xdesId 新增到m_reservedCnt的最近的事務id m_ghostRecCnt 幻影資料的行數 m_tornBits 頁的校驗位或者被由資料庫頁面保護形式決定頁面保護位取代 資料庫頁面的 lsn SQL Server在記憶體中維護一個雜湊表,記錄下自己所有做過寫入動作的頁面最新的LSN(Log Sequence Number)值。 在下次讀出頁面的時候,會去比較這兩個值是否相等。由於LSN是個自動增長的唯一值,每個發生新修改的頁面, LSN的值會比原來的要大。所以如果讀到的LSN與記憶體中存放的不一致,就說明上次的寫入請求沒有真正完成。 這時824錯誤也會被觸發。 */ Allocation Status GAM (1:2) = ALLOCATED SGAM (1:3) = ALLOCATED PFS (1:1) = 0x60 MIXED_EXT ALLOCATED 0_PCT_FULL DIFF (1:6) = CHANGED ML (1:7) = NOT MIN_LOGGED

 

 
選項為1,輸出可讀形式的資料頁頁頭資料,並且還有槽位對應記錄的十六進位制內容。頁頭資料已在上文分析,不做處理,這裡截圖描述槽位對應記錄
dbcc page('dbpage',1,309,1)
 
----------------------------------------------------------------------------------------------------------
頁頭資訊省略中...
 
 
Slot 0, Offset 0x60, Length 3059, DumpStyle BYTE
/*
Slot 槽位號,一個槽位一行資料,這一行資料從 0x60 = 96開始,長度是 3059 bytes
下文文該行記錄的16進位制內容
*/
Record Type = PRIMARY_RECORD        Record Attributes =  NULL_BITMAP VARIABLE_COLUMNS
Record Size = 3059                 
Memory Dump @0x000000001F978060
 
/*下文為這一行記錄 3059個位元組內容*/
0000000000000000:   30000800 01000000 0400a003 002b80e3 0bf38b02  0............+......
0000000000000014:   00000001 000000d5 69000070 17000033 01000001  ........i..p...3....
0000000000000028:   00000028 72707429 2c594553 204f5220 4e4f2c53  ...(rpt),YES OR NO,S
000000000000003C:   59535245 4d4f5445 4c4f4749 4e532054 59504553  YSREMOTELOGINS TYPES
中間省略...
0000000000000BCC:   7072696d 61727920 6b65792c 616e7369 5f6e756c  primary key,ansi_nul
0000000000000BE0:   6c5f6400 00d10700 00000031 01000001 000100    l_d........1.......
 
OFFSET TABLE:
 
Row - Offset                       
0 (0x0) - 96 (0x60)     

 


選項為2, 輸出整個資料頁頁頭的十六進位制資料,整一頁的內容都顯示,包括未使用的空間。

dbcc page('dbpage',1,309,2)
 
----------------------------------------------------------------------------------------------------------
頁頭資訊省略中...
 
/*下文為一整頁的資料儲存情況,包括行記錄跟空閒空間,不區分槽位*/
DATA:
 
Memory Dump @0x0000000028178000
 
0000000028178000:   01010000 00c00001 00000000 00000800 00000000  ....................
0000000028178014:   00000100 23000000 ab13530c 35010000 01000000  ....#.....S.5.......
0000000028178028:   27000000 90010000 44000000 00000000 00000000  '.......D...........
000000002817803C:   00000000 01000000 00000000 00000000 00000000  ....................
0000000028178050:   00000000 00000000 00000000 00000000 30000800  ................0...
0000000028178064:   01000000 0400a003 002b80e3 0bf38b02 00000001  .........+..........
0000000028178078:   000000d5 69000070 17000033 01000001 00000028  ....i..p...3.......(
000000002817808C:   72707429 2c594553 204f5220 4e4f2c53 59535245  rpt),YES OR NO,SYSRE
00000000281780A0:   4d4f5445 4c4f4749 4e532054 59504553 2c535953  MOTELOGINS TYPES,SYS
省略中...
0000000028178C1C:   65726963 20726f75 6e646162 6f72742c 7072696d  eric roundabort,prim
0000000028178C30:   61727920 6b65792c 616e7369 5f6e756c 6c5f6400  ary key,ansi_null_d.
0000000028178C44:   00d10700 00000031 01000001 00010000 00212121  .......1.........!!!
0000000028178C58:   21212121 21212121 21212121 21212121 21212121  !!!!!!!!!!!!!!!!!!!!
0000000028178C6C:   21212121 21212121 21212121 21212121 21212121  !!!!!!!!!!!!!!!!!!!!
省略中...
0000000028179FE0:   21212121 21212121 21212121 21212121 21212121  !!!!!!!!!!!!!!!!!!!!
0000000028179FF4:   21212121 21212121 21216000                    !!!!!!!!!!`.
 
OFFSET TABLE:
 
Row - Offset
0 (0x0) - 96 (0x60)

    選項為3, 輸出可讀形式的資料頁頁頭資料,並且包括記錄中每個欄位的可讀形式,行溢位資料也會顯示資料內容,但是大物件則不顯示內容,而是說明其儲存位置!

dbcc page('dbpage',1,309,3)
 
 
-------------------------------------------------------------------------------------------------
頁頭資訊省略中...
 
Slot 0 Offset 0x60 Length 3059
/*
Slot 槽位號,一個槽位一行資料,這一行資料從 0x60 = 96開始,長度是 3059 bytes
*/
Record Type = PRIMARY_RECORD        Record Attributes =  NULL_BITMAP VARIABLE_COLUMNS
Record Size = 3059
Memory Dump @0x000000002BB78060
 
/*下文為這一行記錄 3059個位元組內容*/
0000000000000000:   30000800 01000000 0400a003 002b80e3 0bf38b02  0............+......
0000000000000014:   00000001 000000d5 69000070 17000033 01000001  ........i..p...3....
0000000000000028:   00000028 72707429 2c594553 204f5220 4e4f2c53  ...(rpt),YES OR NO,S
000000000000003C:   59535245 4d4f5445 4c4f4749 4e532054 59504553  YSREMOTELOGINS TYPES
0000000000000050:   2c535953 52454d4f 54454c4f 47494e53 20545950  ,SYSREMOTELOGINS TYP
0000000000000064:   45532028 55504441 5445292c 41463a20 61676772  ES (UPDATE),AF: aggr
0000000000000078:   65676174 65206675 6e637469 6f6e2c41 503a2061  egate function,AP: a
中間省略...
0000000000000BB8:   2c6e756d 65726963 20726f75 6e646162 6f72742c  ,numeric roundabort,
0000000000000BCC:   7072696d 61727920 6b65792c 616e7369 5f6e756c  primary key,ansi_nul
0000000000000BE0:   6c5f6400 00d10700 00000031 01000001 000100    l_d........1.......
 
/*下文為 在槽位0 slot 0 的 這一行記錄 ,詳細描述每一列的儲存情況*/
Slot 0 Column 1 Offset 0x4 Length 4 Length (physical) 4
/*slot 0,第一列 在本頁佔用4位元組,列名為id,值為1*/
id = 1
 
namea = [BLOB Inline Root] Slot 0 Column 2 Offset 0x13 Length 24 Length (physical) 24
/*slot 0,第2列,本頁佔用24位元組,列名為namea
這裡可以看到是發生了行溢位情況,列中沒有資料,但是儲存了該列的實際位置
實際大小為6000位元組,值 儲存在第一個檔案第307頁的 slot 0 槽位上*/
 
Level = 0                           Unused = 0                          UpdateSeq = 1
TimeStamp = 1775566848              Type = 2
Link 0
 
Size = 6000                         RowId = (1:307:0)
 
Slot 0 Column 3 Offset 0x2b Length 3000 Length (physical) 3000
 
nameb = (rpt),YES OR NO,SYSREMOTELOGINS TYPES,SYSREMOTELOGINS TYPES (UPDATE),AF: aggregate function,AP: applicati
on,C : check cns,...省略中...primary key,ansi_null_d
/*slot 0,第3列 ,本頁佔用3000位元組,列名為nameb ,值為 nameb= 的後面一大段中*/
 
descriptions = [Textpointer] Slot 0 Column 4 Offset 0xbe3 Length 16 Length (physical) 16
/*slot 0,第4列 ,該列為text資料型別,本頁佔用16位元組,列名為descriptions,其值儲存在第一個檔案的第305頁的 slot 1 槽位上*/
 
TextTimeStamp = 131137536           RowId = (1:305:1)
 
Slot 0 Offset 0x0 Length 0 Length (physical) 0
 
/*該表格有主鍵 ,該行的keyhashvalue值*/
 
KeyHashValue = (8194443284a0)

 

    選項為3,還有一個特殊情況,就是當分析非聚集索引的時候,其返回會多一個 table 
 
create table tbpage(id int primary key not null identity(1,1) ,cola int,colb varchar(10),colc varchar(100))
 
insert into tbpage(cola,colb,colc) select object_id,type,name from sys.objects
 
create index ix_colc on tbpage(colc)
 
select * from sys.indexes where name='ix_colc'
 
dbcc ind('dbpage','tbpage',-1)

 

 
 
 dbcc page('dbpage',1,319,3)
返回多了一個可讀性的列表,詳細描述索引的列情況及鍵值情況,同時,原先的訊息內容也還保持。

 

 

 


 
參考博文:
 
參考書籍:
《SQL SERVER 2012 實施與實戰管理指南》
《SQL Server效能調優實戰》
《SQL SERVER 2005 技術內幕 儲存引擎》
 

相關文章