การเรียงลำดับแบบลอจิคัลของคอลัมน์ในตารางมีผลกระทบกับลำดับฟิสิคัลที่เลเยอร์การจัดเก็บหรือไม่? ใช่.
ไม่ว่ามันจะสำคัญหรือไม่ก็เป็นอีกเรื่องที่ฉันยังไม่สามารถตอบได้
ในทำนองเดียวกันกับที่อธิบายไว้ในบทความที่เชื่อมโยงบ่อยๆจาก Paul Randal เกี่ยวกับกายวิภาคของบันทึกลองดูที่ตารางคอลัมน์สองคอลัมน์อย่างง่ายกับ DBCC IND:
SET STATISTICS IO OFF;
SET STATISTICS TIME OFF;
USE master;
GO
IF DATABASEPROPERTY (N'RowStructure', 'Version') > 0 DROP DATABASE RowStructure;
GO
CREATE DATABASE RowStructure;
GO
USE RowStructure;
GO
CREATE TABLE FixedLengthOrder
(
c1 INT IDENTITY(1,1) PRIMARY KEY CLUSTERED
, c2 CHAR(10) DEFAULT REPLICATE('A', 10) NOT NULL
, c3 CHAR(10) DEFAULT REPLICATE('B', 10) NOT NULL
);
GO
INSERT FixedLengthOrder DEFAULT VALUES;
GO
DBCC IND ('RowStructure', 'FixedLengthOrder', 1);
GO
ผลลัพธ์ข้างต้นแสดงให้เห็นว่าเราต้องดูที่หน้า 89:
DBCC TRACEON (3604);
GO
DBCC PAGE ('RowStructure', 1, 89, 3);
GO
ในผลลัพธ์จาก DBCC PAGE เราจะเห็น c1 อัดแน่นไปด้วยตัวอักษร 'A' ก่อนที่จะเป็น c2 ':
Memory Dump @0x000000000D25A060
0000000000000000: 10001c00 01000000 41414141 41414141 †........AAAAAAAA
0000000000000010: 41414242 42424242 42424242 030000††††AABBBBBBBBBB...
และเพราะให้เปิดหน้าอกRowStructure.mdf
ด้วยโปรแกรมแก้ไข hex และยืนยันสตริง 'A' นำหน้าสตริง 'B' ต่อไป:
ตอนนี้ทำการทดสอบซ้ำ แต่กลับลำดับของสตริงโดยวางอักขระ 'B' ใน c1 และอักขระ 'A' ใน c2:
CREATE TABLE FixedLengthOrder
(
c1 INT IDENTITY(1,1) PRIMARY KEY CLUSTERED
, c2 CHAR(10) DEFAULT REPLICATE('B', 10) NOT NULL
, c3 CHAR(10) DEFAULT REPLICATE('A', 10) NOT NULL
);
GO
เวลานี้เอาต์พุต DBCC PAGE ของเราจะแตกต่างกันและสตริง 'B' จะปรากฏขึ้นก่อน:
Memory Dump @0x000000000FC2A060
0000000000000000: 10001c00 01000000 42424242 42424242 †........BBBBBBBB
0000000000000010: 42424141 41414141 41414141 030000††††BBAAAAAAAAAA...
อีกครั้งสำหรับ giggles ให้ตรวจสอบ hex dump ของไฟล์ข้อมูล:
ตามที่กายวิภาคของระเบียนอธิบายคอลัมน์ความยาวคงที่และตัวแปรของระเบียนจะถูกเก็บไว้ในบล็อกที่แตกต่างกัน การแทรกสอดแบบคงที่แบบโลจิคัลและชนิดคอลัมน์แบบโลจิคัลไม่มีผลต่อเร็กคอร์ดทางกายภาพ อย่างไรก็ตามภายในแต่ละบล็อกลำดับของคอลัมน์ของคุณจะจับคู่กับลำดับของไบต์ในไฟล์ข้อมูล
CREATE TABLE FixedAndVariableColumns
(
c1 INT IDENTITY(1,1) PRIMARY KEY CLUSTERED
, c2 CHAR(10) DEFAULT REPLICATE('A', 10) NOT NULL
, c3 VARCHAR(10) DEFAULT REPLICATE('B', 10) NOT NULL
, c4 CHAR(10) DEFAULT REPLICATE('C', 10) NOT NULL
, c5 VARCHAR(10) DEFAULT REPLICATE('D', 10) NOT NULL
, c6 CHAR(10) DEFAULT REPLICATE('E', 10) NOT NULL
);
GO
Memory Dump @0x000000000E07C060
0000000000000000: 30002600 01000000 41414141 41414141 †0.&.....AAAAAAAA
0000000000000010: 41414343 43434343 43434343 45454545 †AACCCCCCCCCCEEEE
0000000000000020: 45454545 45450600 00020039 00430042 †EEEEEE.....9.C.B
0000000000000030: 42424242 42424242 42444444 44444444 †BBBBBBBBBDDDDDDD
0000000000000040: 444444†††††††††††††††††††††††††††††††DDD
ดูสิ่งนี้ด้วย:
ลำดับคอลัมน์ไม่สำคัญ…โดยทั่วไป แต่ - ขึ้นอยู่กับมัน!
CREATE TABLE
คำสั่ง (ยกเว้นว่าคอลัมน์สำคัญ CI มาก่อนในส่วน) แม้ว่าลำดับของคอลัมน์สามารถเปลี่ยนแปลงได้หากALTER COLUMN
การเปลี่ยนแปลงประเภทข้อมูล / ความยาวคอลัมน์ กรณีเล็ก ๆ น้อย ๆ เท่านั้นที่มันสำคัญที่ฉันคิดได้ก็คือคอลัมน์ในตอนท้ายของส่วนความยาวผันแปรที่มีสตริงว่างหรือ NULL ไม่มีที่ว่างเลยในคอลัมน์ออฟเซ็ตของคอลัมน์ (แสดงโดย Kalen Delaney ในหนังสือภายในปี 2008)