Hat die logische Reihenfolge der Spalten in einer Tabelle Auswirkungen auf ihre physische Reihenfolge auf der Speicherebene? Ja.
Ob es darauf ankommt oder nicht, ist ein anderes Thema, das ich (noch) nicht beantworten kann.
Schauen wir uns eine einfache zweispaltige Tabelle mit DBCC IND an, ähnlich wie in dem häufig verlinkten Artikel von Paul Randal über die Anatomie eines Datensatzes beschrieben:
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
Die Ausgabe oben zeigt, dass wir uns Seite 89 ansehen müssen:
DBCC TRACEON (3604);
GO
DBCC PAGE ('RowStructure', 1, 89, 3);
GO
In der Ausgabe von DBCC PAGE sehen wir c1 gefüllt mit dem Zeichen 'A' vor c2 'B':
Memory Dump @0x000000000D25A060
0000000000000000: 10001c00 01000000 41414141 41414141 †........AAAAAAAA
0000000000000010: 41414242 42424242 42424242 030000††††AABBBBBBBBBB...
Und nur weil, lassen Sie RowStructure.mdf
uns mit einem Hex-Editor aufspringen und bestätigen, dass die 'A'-Zeichenfolge der' B'-Zeichenfolge vorausgeht:
Wiederholen Sie nun den Test, aber kehren Sie die Reihenfolge der Zeichenfolgen um, indem Sie die Zeichen 'B' in c1 und die Zeichen 'A' in c2 einfügen:
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
Diesmal ist unsere DBCC PAGE-Ausgabe anders und die 'B'-Zeichenfolge erscheint zuerst:
Memory Dump @0x000000000FC2A060
0000000000000000: 10001c00 01000000 42424242 42424242 †........BBBBBBBB
0000000000000010: 42424141 41414141 41414141 030000††††BBAAAAAAAAAA...
Lassen Sie uns noch einmal, nur um zu kichern, den Hex-Dump der Datendatei überprüfen:
Wie Anatomy of a Record erläutert, werden die Spalten mit fester und variabler Länge eines Datensatzes in unterschiedlichen Blöcken gespeichert. Das logische Verschachteln von festen und variablen Spaltentypen hat keine Auswirkung auf den physischen Datensatz. Innerhalb jedes Blocks entspricht die Reihenfolge Ihrer Spalten jedoch der Reihenfolge der Bytes in der Datendatei.
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
Siehe auch:
Spaltenreihenfolge spielt keine Rolle ... im Allgemeinen, aber - ES HÄNGT AB!
CREATE TABLE
Anweisung entspricht (mit der Ausnahme, dass CI-Schlüsselspalten im Abschnitt an erster Stelle stehen). Die Reihenfolge der Spalten kann sich jedoch ändern, wennALTER COLUMN
sich Datentypen / Spaltenlängen ändern . Der einzige kleine Fall , in dem es wichtig ist, dass ich mich vorstellen kann ist , dass Spalten am Ende des Abschnitts mit variabler Länge mit leeren String oder NULL überhaupt in der Spalte Offset - Array keinen Platz nehmen (nachgewiesen durch Kalen Delaney in den 2008 Interna buchen)