溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

SQL Server內(nèi)幕之數(shù)據(jù)頁

發(fā)布時間:2020-07-08 02:37:12 來源:網(wǎng)絡 閱讀:831 作者:易語隨風去 欄目:關系型數(shù)據(jù)庫

數(shù)據(jù)頁是包含已添加到數(shù)據(jù)庫表中的用戶數(shù)據(jù)的結構。

如前所述, 數(shù)據(jù)頁有三種, 每個都以不同的格式存儲數(shù)據(jù)。

SQL server 有行內(nèi)數(shù)據(jù)頁、行溢出數(shù)據(jù)頁和 LOB 數(shù)據(jù)頁。

與 SQL server 中的所有其他類型的頁一樣, 數(shù)據(jù)頁的大小固定為 8 KB 或8192字節(jié)。

它們由三主要組件組成: 頁面頁眉、數(shù)據(jù)行和行偏移量數(shù)組, 如圖6-4 所示。

SQL Server內(nèi)幕之數(shù)據(jù)頁


頁標題


如圖6-4 所示, 頁標題占據(jù)每個數(shù)據(jù)頁的前96個字節(jié) (為數(shù)據(jù)、行開銷和行偏移保留8096個字節(jié))。表6-5 列出了檢查頁標題時顯示的一些信息。

SQL Server內(nèi)幕之數(shù)據(jù)頁


行內(nèi)數(shù)據(jù)的數(shù)據(jù)行


頁標題后面是存儲表實際數(shù)據(jù)行的區(qū)域。單個數(shù)據(jù)行的最大大小為8060字節(jié)的行內(nèi)數(shù)據(jù)。

行還可以在單獨的頁上存儲行溢出和 LOB 數(shù)據(jù)。

在給定頁上存儲的行數(shù)根據(jù)表結構和存儲的數(shù)據(jù)而變化。

具有所有固定長度列的表始終可以存儲每頁相同的行數(shù);

可變長度行可以根據(jù)輸入數(shù)據(jù)的實際長度, 存儲盡可能多的行。

保持行長更短可以使更多行適合頁面, 從而減少 i/o 并增加所需數(shù)據(jù)在緩存中的可能。


行偏移量數(shù)組


行偏移量數(shù)組是2字節(jié)項的塊, 每個條目表示相應數(shù)據(jù)行開始的頁面上的偏移量。

每行在這個數(shù)組中都有一個2字節(jié)的條目 (正如前面所討論的, 當您閱讀每行所需的10個開銷字節(jié)時)。

雖然這些字節(jié)沒有存儲在數(shù)據(jù)行中, 但它們確實會影響適合頁面的行數(shù)。


行偏移量數(shù)組指示頁上行的邏輯順序。

例如, 如果表具有聚集索引, SQL server 將按聚集索引鍵的順序存儲這些行。

這并不意味著行按聚集索引鍵的順序物理地存儲在頁面上。

相反, 偏移量數(shù)組中的插槽0引用聚集索引鍵順序中的第一行, 插槽1引用第二行, 依此類推。

正如您在檢查實際頁面時所看到的那樣, 這些行的物理位置可以位于頁面的任何位置。


查看數(shù)據(jù)頁


可以使用 DBCC 頁命令查看數(shù)據(jù)頁的內(nèi)容, 

這允許您查看數(shù)據(jù)庫中任何給定頁的頁標題、數(shù)據(jù)行和行偏移表。

只有系統(tǒng)管理員才能使用 DBCC 頁。

但是, 由于通常不需要查看數(shù)據(jù)頁的內(nèi)容, 因此在 SQL server 文檔中找不到有關 DBCC 頁的信息。

不過, 如果您想使用它, 下面是語法:

DBCC PAGE ({dbid | dbname}, filenum, pagenum[, printopt])


DBCC 頁面命令包含表6-6 中顯示的參數(shù)。

清單6-4 中的代碼和結果顯示來自 DBCC 頁的示例輸出, 其 printopt 值為1。

請注意, DBCC TRACEON (3604) 指示 SQL server 將結果返回給客戶端。

如果沒有此 traceflag, 則不會為 DBCC 頁命令返回輸出。


SQL Server內(nèi)幕之數(shù)據(jù)頁

正如所看到的, DBCC 頁的輸出分為四主要部分: 緩沖區(qū)、頁標題、數(shù)據(jù)和偏移量表 (實際上是偏移量數(shù)組)。

緩沖區(qū)部分顯示有關給定頁的緩沖區(qū)的信息。

此上下文中的緩沖區(qū)是管理頁的內(nèi)存結構, 本節(jié)中的信息僅在頁處于內(nèi)存中時才相關。


從 DBCC 頁的 "輸出" 頁標題部分顯示頁上所有標題字段的數(shù)據(jù)。

(表6-5 顯示了大多數(shù)這些字段的含義。數(shù)據(jù)節(jié)包含每行的信息。

使用具有 printopt 值1或3的 DBCC 頁表示插槽位置, 即每行的6個表存儲257、頁上的行的偏移量和行的長度。

行數(shù)據(jù)分為三部分。


左列指示顯示數(shù)據(jù)所在行內(nèi)的字節(jié)位置。

中間部分包含存儲在頁面上的實際數(shù)據(jù), 每五列顯示八個十六進制數(shù)字。

最右邊的列包含數(shù)據(jù)的 ASCII 字符表示形式。 此列中只有字符數(shù)據(jù)是可讀的, 盡管可能會顯示某些其他數(shù)據(jù)。

"偏移量表" 部分顯示頁面末尾的行偏移量數(shù)組的內(nèi)容。


在 DBCC 頁的輸出中, 您可以看到此頁包含23行, 第一行 (由插槽0指示) 從偏移量 1585 (0x631) 開始。

實際存儲在頁面上的第一行實際上是6行, 而行偏移量數(shù)組中的偏移量為96。printopt 值為1的 DBCC 頁顯示 "插槽編號" 順序中的行, 即使可以從每個插槽的偏移量中看到, 也不是在頁面上實際存在行的順序。

如果使用 printopt 值為2的 DBCC 頁, 則會看到頁的所有8096個字節(jié) (標頭之后) 的轉儲, 按它們存儲在頁面上的順序排列。


向AI問一下細節(jié)

免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權內(nèi)容。

AI