標籤:b樹 func 一個資料庫 name bin 標識 子節點 效能調優 ast
閱讀目錄(Content)
- 1 資料頁的類型
- 2 資料頁結構
- 2.1 頁頭
- 2.2 行記錄
- 2.3 空閑空間
- 2.4 行位移量
- 3 查詢資料頁儲存格式的途徑
- 3.1 dbcc ind
- 3.2 dbcc page
如果轉載,請註明博文來源: www.cnblogs.com/xinysu/ ,著作權歸 部落格園 蘇家小蘿蔔 所有。望各位支援! SQLServer的資料頁大小是8kb,8個連續的物理頁組成一個區。區分混合區跟統一區,混合區內可以儲存不同資料庫物件的內容,通常這個資料庫物件較小;統一區表示區內連續的8個資料頁儲存的都是同一個資料庫物件的內容。 SQL SERVER的磁碟讀寫是按頁級進行,每次I/O操作的資料最小單位是以8kb為單位的頁。頁是儲存單位,區是管理單位。 資料頁根據其儲存內容不同,分為多種類型,本文簡要描述。回到頂部(go to top)
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
- LOB_DATA
- 儲存大型物件 (LOB) 資料類型,例如 xml、varbinary(max) 和 varchar(max)。
- ROW_OVERFLOW_DATA
- 儲存超過 8,060 位元組行大小限制的 varchar、nvarchar、varbinary 或 sql_variant 列中儲存的可變長度資料。
每個有資料的表格,至少有一個 IAM頁來管理 IN_ROW_DATA的儲存情況,如果表格裡有LOB_DATA,則會多一個IAM頁來管理LOB_DATA,ROW_OVERFLOW_DATA也是一樣。
回到頂部(go to top)
2 資料頁結構 資料頁有4個部分:頁頭、行記錄、空閑空間及行位移量。詳見:
2.1 頁頭
佔用96位元組,儲存跟該頁面相關的系統資料。
頁頭的內容如下:
2.2 行記錄
- 儲存資料行記錄以及索引資料
- 行記錄也可以在獨立頁面上儲存,比如資料列溢位資料即LOB資料
2.3 空閑空間
- 除去頁頭,行記錄,以及位移量剩下的空間,提供給行記錄及行位移量使用
2.4 行位移量
- 行位移是一個個小塊組成的,每個小塊2個位元組,表示資料行從第幾個位元組後開始記錄,也就是距離頁頭多少位移量開始記錄
- 儲存方式是從有往左儲存,用槽位來描述,slot 0 ,slot 1 ....
- 行位移量記錄的內容是什麼呢?該行記錄從哪個位元組開始,一般情況下,slot 1 從第96個位元組後開始
- 常說的叢集索引儲存順序是物理排序,指的不是行記錄物理排序,而是行位移量物理排序,資料頁中,行記錄都是順序往後添加的,通過修改行位移量來達到叢集索引的順序尋找
回到頂部(go to top)
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 DATA的資料頁面,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 = 0bsampleCount = 0 bUse1 = 46781 bstat = 0xbblog = 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,其他頁為0m_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 = 72057594040221696Metadata: PartitionId = 72057594038976512 Metadata: IndexId = 1Metadata: ObjectId = 341576255 m_prevPage = (0:0) m_nextPage = (0:0)/*Metadata: AllocUnitId 儲存單元的ID,sys.allocation_units.allocation_unit_idMetadata: PartitionId 資料頁所在的分區號,sys.partitions.partition_idMetadata: ObjectId 該頁面所屬的對象的id,sys.objects.object_idMetadata: IndexId sys.objects.object_id&sys.indexes.index_idm_prevPage 該資料頁的前一頁面m_nextPage 該資料頁的後一頁面*/pminlen = 8 m_slotCnt = 1 m_freeCnt = 5035m_freeData = 3155 m_reservedCnt = 0 m_lsn = (39:400:68)m_xactReserved = 0 m_xdesId = (0:0) m_ghostRecCnt = 0m_tornBits = 0 DB Frag ID = 1/*pminlen 定長資料所佔的位元組數為多少個位元組m_slotCnt 頁面中的資料的行數m_freeCnt 頁面中剩餘的空間,還剩多少位元組的空間m_freeData 頁面空閑空間的起始位置,一個頁面8KB約等於8192位元組 頁面空閑空間的位置在3155m_reservedCnt 活動事務釋放的位元組數m_lsn 日誌記錄號m_xactReserved 最新加入到m_reservedCnt領域的位元組數m_xdesId 添加到m_reservedCnt的最近的事務idm_ghostRecCnt 幻影資料的行數m_tornBits 頁的校正位或者被由資料庫頁面保護形式決定頁面保護位取代 資料庫頁面的 lsnSQL Server在記憶體中維護一個雜湊表,記錄下自己所有做過寫入動作的頁面最新的LSN(Log Sequence Number)值。在下次讀出頁面的時候,會去比較這兩個值是否相等。由於LSN是個自動成長的唯一值,每個發生新修改的頁面,LSN的值會比原來的要大。所以如果讀到的LSN與記憶體中存放的不一致,就說明上次的寫入請求沒有真正完成。這時824錯誤也會被觸發。*/ Allocation Status GAM (1:2) = ALLOCATED SGAM (1:3) = ALLOCATEDPFS (1:1) = 0x60 MIXED_EXT ALLOCATED 0_PCT_FULL DIFF (1:6) = CHANGEDML (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_COLUMNSRecord 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,S000000000000003C: 59535245 4d4f5445 4c4f4749 4e532054 59504553 YSREMOTELOGINS TYPES中間省略...0000000000000BCC: 7072696d 61727920 6b65792c 616e7369 5f6e756c primary key,ansi_nul0000000000000BE0: 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,SYSRE00000000281780A0: 4d4f5445 4c4f4749 4e532054 59504553 2c535953 MOTELOGINS TYPES,SYS省略中...0000000028178C1C: 65726963 20726f75 6e646162 6f72742c 7072696d eric roundabort,prim0000000028178C30: 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 - Offset0 (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_COLUMNSRecord Size = 3059Memory 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,S000000000000003C: 59535245 4d4f5445 4c4f4749 4e532054 59504553 YSREMOTELOGINS TYPES0000000000000050: 2c535953 52454d4f 54454c4f 47494e53 20545950 ,SYSREMOTELOGINS TYP0000000000000064: 45532028 55504441 5445292c 41463a20 61676772 ES (UPDATE),AF: aggr0000000000000078: 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_nul0000000000000BE0: 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 = 1TimeStamp = 1775566848 Type = 2Link 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: application,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)返回多了一個可讀性的列表,詳細描述索引的列情況及索引值情況,同時,原先的訊息內容也還保持。
參考博文:http://www.sqlservercentral.com/blogs/practicalsqldba/2012/10/10/sql-serverunderstanding-the-page-free-space-pfs-page/http://www.sqlservercentral.com/blogs/practicalsqldba/2013/03/07/sql-server-understanding-the-iam-page/參考書籍:《SQL SERVER 2012 實施與實戰管理指南》
《SQL Server效能調優實戰》《SQL SERVER 2005 技術內幕 儲存引擎》
SQL SERVER大話儲存結構(1)