Sql-Server
整數數據記錄如何儲存在 SQL Server 頁面中
我在 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) 字節。