L'ordinamento logico delle colonne in una tabella ha un impatto sul loro ordine fisico a livello di memoria? Sì.
Che sia importante o meno è un problema diverso a cui non posso rispondere (ancora).
In modo simile a quello descritto nell'articolo collegato di frequente di Paul Randal sull'anatomia di un disco , diamo un'occhiata a una semplice tabella a due colonne con 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
L'output sopra mostra che dobbiamo guardare a pagina 89:
DBCC TRACEON (3604);
GO
DBCC PAGE ('RowStructure', 1, 89, 3);
GO
Nell'output di DBCC PAGE vediamo c1 riempito con il carattere 'A' prima della 'B' di c2:
Memory Dump @0x000000000D25A060
0000000000000000: 10001c00 01000000 41414141 41414141 †........AAAAAAAA
0000000000000010: 41414242 42424242 42424242 030000††††AABBBBBBBBBB...
E proprio perché, apriamo il busto RowStructure.mdf
con un editor esadecimale e confermiamo che la stringa 'A' precede la stringa 'B':
Ora ripeti il test ma inverti l'ordine delle stringhe, posizionando i caratteri 'B' in c1 e i caratteri 'A' in 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
Questa volta il nostro output di DBCC PAGE è diverso e la stringa 'B' appare per prima:
Memory Dump @0x000000000FC2A060
0000000000000000: 10001c00 01000000 42424242 42424242 †........BBBBBBBB
0000000000000010: 42424141 41414141 41414141 030000††††BBAAAAAAAAAA...
Ancora una volta, solo per ridacchiare, controlliamo il dump esadecimale del file di dati:
Come spiega Anatomy of a Record , le colonne a lunghezza fissa e variabile di un record sono memorizzate in blocchi distinti. I tipi di colonne fisse e variabili interleaving logicamente non influiscono sul record fisico. Tuttavia, all'interno di ciascun blocco l'ordine delle colonne viene mappato all'ordine dei byte nel file di dati.
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
Guarda anche:
L'ordine delle colonne non ha importanza ... in generale, ma - DIPENDE!
CREATE TABLE
istruzione (tranne che le colonne chiave CI vengono prima nella sezione). Sebbene l'ordine delle colonne possa cambiare se siALTER COLUMN
modificano tipi di dati / lunghezze delle colonne. L'unico caso minore in cui mi viene in mente che mi viene in mente che le colonne alla fine della sezione di lunghezza variabile con stringa vuota o NULL non occupano affatto spazio nell'array offset di colonna (dimostrato da Kalen Delaney nel libro degli interni del 2008)