Bir tablodaki sütunların mantıksal sıralaması, depolama katmanındaki fiziksel sıralarını etkiliyor mu? Evet.
Önemli olup olmaması, (henüz) cevaplayamadığım farklı bir konudur.
Bir kaydın anatomisi üzerine Paul Randal'dan sıkça bağlanan makalede anlatılana benzer şekilde , DBCC IND ile basit iki sütun tablosuna bakalım:
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
Yukarıdaki çıktı, 89. sayfaya bakmamız gerektiğini gösteriyor:
DBCC TRACEON (3604);
GO
DBCC PAGE ('RowStructure', 1, 89, 3);
GO
DBCC PAGE’nin çıktısında, c2’nin before B’den önce “A” karakteriyle doldurulmuş olduğunu görüyoruz:
Memory Dump @0x000000000D25A060
0000000000000000: 10001c00 01000000 41414141 41414141 †........AAAAAAAA
0000000000000010: 41414242 42424242 42424242 030000††††AABBBBBBBBBB...
Ve bunun nedeni, RowStructure.mdf
bir hex editörüyle bust açalım ve 'A' dizesinin 'B' dizesini önceden aldığını onayla:
Şimdi testi tekrarlayın, ancak 'B' karakterlerini c1'e ve 'A' karakterlerini c2'ye yerleştirerek dizelerin sırasını ters çevirin:
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
Bu kez DBCC PAGE çıkışımız farklıdır ve ilk önce 'B' dizgisi görünür:
Memory Dump @0x000000000FC2A060
0000000000000000: 10001c00 01000000 42424242 42424242 †........BBBBBBBB
0000000000000010: 42424141 41414141 41414141 030000††††BBAAAAAAAAAA...
Yine, sadece kıkırdamalar için, veri dosyasının onaltılık dökümünü kontrol edelim:
Olarak bir Record anatomisi açıklar, bir kaydın sabit ve değişken uzunluk sütun farklı bloklar halinde saklanır. Mantıksal olarak serpiştirme sabit ve değişken sütun türlerinin fiziksel kayıt üzerinde hiçbir etkisi yoktur. Ancak, her blokta sütunlarınızın sırası veri dosyasındaki bayt sırasına eşlenir.
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
Ayrıca bakınız:
Sütun düzeni önemli değil… genel olarak, ancak - BT DEPENDS!
CREATE TABLE
ifadeye uygun olduğunu gördüm (CI anahtar sütunlarının bu bölümde ilk gelmesi dışında). VeriALTER COLUMN
türlerini / sütun uzunluklarını değiştirirse, sütunların sırası değişebilir . Aklıma gelebilecek tek küçük durum değişken uzunluk bölümünün sonunda boş dize veya NULL olan sütunların sütun ofset dizisinde hiç yer almamasıdır (2008 iç kitabında Kalen Delaney tarafından gösterilmiştir)