Array ของช่องและขนาดหน้าทั้งหมด


13

ฉันอ่านต่อในฟอรัมจำนวนมากและในหลาย ๆ บล็อกที่หน้าประกอบด้วยดังต่อไปนี้: ขนาดหน้า: 16 x 512B = 8192B ส่วนหัวของหน้า: = 96B แถว In_Row สูงสุด: = 8060B

ใบนี้ (8192 - 96 - 8060) B = 36B

ตกลงนี่เป็นตรรกะและถูกต้อง คำถามที่ฉันมีคือ: ทำไมผู้คนมากมายพูดว่า 36B ที่เหลือถูกสงวนไว้สำหรับอาร์เรย์สล็อต?

เห็นได้ชัดว่าอาร์เรย์สล็อตให้ 2B ต่อแถวในหน้า; ดังนั้นอาจเล็กเพียง 2B และใหญ่ถึง 1472B:

2B: 1 แถว * 2B = 2B

1472B: 8096B = n * 9B (ขนาดแถวขั้นต่ำที่มีค่าใช้จ่าย ... คิดว่าคอลัมน์ TINYINT เดียว) + n * 2B (ราคาอาร์เรย์ของแถวต่อแถว) => 8096 = 11n => n = 8096/11 = 736

736 * 2B = 1472B

นี่ทำให้ฉันถึง 20 เนื่องจากแท็กเวอร์ชัน 14B

USE master ;
GO

CREATE DATABASE test ;
GO

USE test ;
GO

ALTER DATABASE test
    SET ALLOW_SNAPSHOT_ISOLATION ON ;
GO

ALTER DATABASE test
    SET READ_COMMITTED_SNAPSHOT ON ;
GO

DROP TABLE tbl ;
GO

CREATE TABLE tbl
(
      i CHAR(8000) DEFAULT(REPLICATE('a',8000))
    , j CHAR(53)   DEFAULT(REPLICATE('a',53))
) ;

INSERT INTO tbl 
    DEFAULT VALUES ;
GO

DBCC IND (test,tbl,-1) ;
GO
DBCC TRACEON(3604) ;
GO
DBCC PAGE(test,1,272,3) ;
GO

ตัวอย่างอื่น. หากคุณไปที่ 50 จาก 49 คุณจะได้รับ VARCHAR (MAX) ไปที่ LOB_DATA

DROP TABLE tbl ;
GO

CREATE TABLE tbl
(
      i VARCHAR(MAX) DEFAULT(REPLICATE('a',8000))
    , j CHAR(49)   DEFAULT(REPLICATE('a',49))
) ;

sp_tableoption N'tbl', 'large value types out of row', 'OFF' ;
GO

INSERT INTO tbl 
    DEFAULT VALUES ;
GO

DBCC IND (test,tbl,-1) ;
GO
DBCC TRACEON(3604) ;
GO
DBCC PAGE(test,1,272,3) ;
GO

ปรากฏว่าปัญหานี้ยังคงอยู่แม้ใน SQL Server 2012 @SQLKiwi ชี้ไปที่โพสต์นี้โดย Kimberly Tripp - http://www.sqlskills.com/blogs/kimberly/a-simple-start-table-creation-best-practices / .


ความคิดเห็นไม่ได้มีไว้สำหรับการอภิปรายเพิ่มเติม การสนทนานี้ได้รับการย้ายไปแชท
พอลไวท์ 9

คำตอบ:


8

ไหนหน้าจะใช้เพื่อวัตถุประสงค์ภายในเช่นการจัดเรียงวิ่งขนาดแถวสูงสุดคือ 8094 ไบต์ สำหรับหน้าข้อมูลขนาดสูงสุดในแถวรวมทั้งค่าใช้จ่ายในแถวภายใน8060 ไบต์

โอเวอร์เฮดของแถวภายในสามารถขยายได้อย่างมีนัยสำคัญหากใช้คุณสมบัติบางอย่างของเครื่องยนต์ ตัวอย่างเช่นการใช้คอลัมน์กระจัดกระจายลดขนาดข้อมูลที่ผู้ใช้เข้าถึงได้ถึง 8019 ไบต์

เพียงตัวอย่างของแถวภายนอกฉันรู้ว่าค่าใช้จ่ายได้ถึง SQL Server 2012 เป็น 14 ไบต์จำเป็นสำหรับแถว versioned โอเวอร์เฮดภายนอกนี้ทำให้มีการใช้พื้นที่สูงสุดสำหรับแถวเดียวถึง 8074 ไบต์และอีก 2 ไบต์สำหรับรายการอาร์เรย์สล็อตเดียวทำให้รวม 8076 ไบต์ นี่ยังคงสั้น 20 ไบต์ของข้อ จำกัด 8096 (ขนาดหน้า 8192 - ส่วนหัวคงที่ 96 ไบต์)

คำอธิบายได้มากที่สุดคือการที่เดิม 8060 วงเงินไบต์ซ้าย 34 ไบต์สำหรับการขยายตัวในอนาคตที่ 14 ถูกนำมาใช้สำหรับการดำเนินงานแถวเวอร์ชัน

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.