A ordem lógica das colunas em uma tabela tem algum impacto em sua ordem física na camada de armazenamento? Sim.
Se importa ou não, é uma questão diferente que ainda não posso responder.
De maneira semelhante à descrita no artigo frequentemente vinculado de Paul Randal sobre a anatomia de um registro , vejamos uma tabela simples de duas colunas com 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
A saída acima mostra que precisamos olhar para a página 89:
DBCC TRACEON (3604);
GO
DBCC PAGE ('RowStructure', 1, 89, 3);
GO
Na saída do DBCC PAGE, vemos c1 recheado com o caractere 'A' antes dos c2's 'B':
Memory Dump @0x000000000D25A060
0000000000000000: 10001c00 01000000 41414141 41414141 †........AAAAAAAA
0000000000000010: 41414242 42424242 42424242 030000††††AABBBBBBBBBB...
E apenas porque, vamos abrir RowStructure.mdf
com um editor hexadecimal e confirmar que a string 'A' precede a string 'B':
Agora repita o teste, mas inverta a ordem das seqüências, colocando os caracteres 'B' em c1 e os caracteres 'A' em 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
Desta vez, nossa saída DBCC PAGE é diferente e a string 'B' aparece primeiro:
Memory Dump @0x000000000FC2A060
0000000000000000: 10001c00 01000000 42424242 42424242 †........BBBBBBBB
0000000000000010: 42424141 41414141 41414141 030000††††BBAAAAAAAAAA...
Novamente, apenas para rir, vamos verificar o hex dump do arquivo de dados:
Como Anatomia de um registro explica, as colunas de comprimento fixo e variável de um registro são armazenadas em blocos distintos. A intercalação lógica de tipos de coluna fixa e variável não influencia o registro físico. No entanto, dentro de cada bloco, a ordem das suas colunas é mapeada para a ordem dos bytes no arquivo de dados.
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
Veja também:
A ordem das colunas não importa ... geralmente, mas - DEPENDE!
CREATE TABLE
instrução (exceto que as colunas-chave do IC vêm primeiro na seção). Embora a ordem das colunas possa mudar se osALTER COLUMN
tipos de dados / comprimento das colunas forem alterados. O único caso menor em que importa que eu possa pensar é que as colunas no final da seção de comprimento variável com string vazia ou NULL não ocupam espaço algum na matriz de deslocamento de coluna (demonstrada por Kalen Delaney no livro de 2008)