Sql-Server

整數數據記錄如何儲存在 SQL Server 頁面中

  • April 21, 2017

我在 SQL Server 中見過 8KB(8192 = 96 Header + 36 Row Offset + 8060 Free space)頁面架構。當談到在 Page 中儲存數據記錄時,我很困惑。

在下表中,我為列 ID 創建了整數,它應該佔用 4 個字節,但每個記錄大小/長度都顯示在 DBCC PAGE 命令 11 個字節中。

我創建了一個簡單的表格,如下所示:

CREATE TABLE PAGETEST
(
   ID int primary key
)
GO
INSERT INTO PAGETEST values (200)  

問 1)。為什麼一個簡單的整數數據需要 4 個實際字節的數據 + 7 個額外字節 = 11 個字節。

問 2)。任何人都可以解釋記錄如何儲存在頁面中。

請找到以下圖片:

在此處輸入圖像描述

要記住的一件重要事情是行儲存表的最小行大小為 9 字節。您可以在此處的答案和評論中看到有關該問題的一些詳細資訊。如果您要創建範例數據並在頁面中進行探勘,我建議您至少創建幾列以使您所看到的內容更加清晰。否則,您可能會遇到這樣一種情況,即具有單列的表TINYINT似乎佔用的空間與具有單列的表一樣多SMALLINT,這起初沒有意義。

CREATE TABLE dbo.X_TINYINT (ID SMALLINT NOT NULL);
CREATE TABLE dbo.X_SMALLINT (ID SMALLINT NOT NULL);

INSERT INTO dbo.X_TINYINT WITH (TABLOCK)
SELECT TOP (100000) 0
FROM master..spt_values t1
CROSS JOIN master..spt_values t2
OPTION (MAXDOP 1);

INSERT INTO dbo.X_SMALLINT WITH (TABLOCK)
SELECT * FROM dbo.X_TINYINT;

sp_spaceused 'X_TINYINT'; -- 1096 KB reserved

sp_spaceused 'X_SMALLINT'; -- 1096 KB reserved

正如@sabin bio 提到的,本文對此進行了更好的解釋。 https://www.sqlskills.com/blogs/paul/inside-the-storage-engine-anatomy-of-a-record/

在您的頁面轉儲中,如果您查看 c8 的十六進制值,它會變成十進制的 200。那是您插入的數據。

c8000000 佔用 4 個字節,即定長數據。Paul 的博文中解釋了固定長度數據前後的 4 (1000800) 和 3 (01000) 字節。

引用自:https://dba.stackexchange.com/questions/171601