Apakah urutan logis kolom dalam tabel memiliki dampak pada urutan fisik mereka di lapisan penyimpanan? Iya nih.
Apakah itu penting atau tidak adalah masalah yang berbeda yang belum bisa saya jawab (belum).
Dalam cara yang mirip dengan yang dijelaskan dalam artikel yang sering dikaitkan dari Paul Randal tentang anatomi catatan , mari kita lihat tabel dua kolom sederhana dengan 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
Output di atas menunjukkan bahwa kita perlu melihat halaman 89:
DBCC TRACEON (3604);
GO
DBCC PAGE ('RowStructure', 1, 89, 3);
GO
Dalam output dari DBCC PAGE kita melihat c1 diisi dengan karakter 'A' sebelum c2's 'B':
Memory Dump @0x000000000D25A060
0000000000000000: 10001c00 01000000 41414141 41414141 †........AAAAAAAA
0000000000000010: 41414242 42424242 42424242 030000††††AABBBBBBBBBB...
Dan hanya karena, mari kita buka RowStructure.mdf
dengan editor hex dan konfirmasikan string 'A' mendahului string 'B':
Sekarang ulangi tes tetapi balik urutan string, menempatkan karakter 'B' di c1 dan karakter 'A' di 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
Kali ini output PAGE DBCC kami berbeda dan string 'B' muncul lebih dulu:
Memory Dump @0x000000000FC2A060
0000000000000000: 10001c00 01000000 42424242 42424242 †........BBBBBBBB
0000000000000010: 42424141 41414141 41414141 030000††††BBAAAAAAAAAA...
Sekali lagi, hanya untuk cekikikan, mari kita periksa hex dump dari file data:
Seperti yang dijelaskan Anatomi Catatan , kolom panjang tetap dan variabel catatan disimpan dalam blok yang berbeda. Jenis kolom tetap dan variabel interleaving yang logis tidak memiliki kaitan dengan catatan fisik. Namun, dalam setiap blok urutan kolom Anda tidak memetakan ke urutan byte dalam file data.
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
Lihat juga:
Urutan kolom tidak masalah ... secara umum, tetapi - ITU TERGANTUNG!
CREATE TABLE
pernyataan (kecuali bahwa kolom kunci CI yang lebih dulu di bagian). Padahal urutan kolom bisa berubah jikaALTER COLUMN
mengubah tipe data / panjang kolom. Satu-satunya kasus kecil di mana hal itu penting yang dapat saya pikirkan adalah bahwa kolom pada akhir bagian panjang variabel dengan string kosong atau NULL tidak mengambil ruang sama sekali dalam array kolom offset (ditunjukkan oleh Kalen Delaney dalam buku internal 2008)