테이블에서 열의 논리적 순서가 스토리지 계층의 물리적 순서에 영향을 미칩니 까? 예.
중요한지 여부는 아직 대답 할 수없는 다른 문제입니다.
레코드 분석에 관한 Paul Randal의 자주 링크 된 기사에 설명 된 것과 유사한 방식으로 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
위의 결과는 89 페이지를 봐야한다는 것을 보여줍니다.
DBCC TRACEON (3604);
GO
DBCC PAGE ('RowStructure', 1, 89, 3);
GO
DBCC PAGE의 출력에서 c1은 c2의 'B'이전에 문자 'A'로 채워져 있습니다.
Memory Dump @0x000000000D25A060
0000000000000000: 10001c00 01000000 41414141 41414141 †........AAAAAAAA
0000000000000010: 41414242 42424242 42424242 030000††††AABBBBBBBBBB...
그리고 RowStructure.mdf
16 진수 편집기로 버스트를 열고 'A'문자열이 'B'문자열보다 우선하는지 확인하십시오.
이제 테스트를 반복하되 c1에 'B'문자를, c2에 'A'문자를 배치하여 문자열 순서를 반대로 바꿉니다.
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
이번에는 DBCC PAGE 출력이 다르고 'B'문자열이 먼저 나타납니다.
Memory Dump @0x000000000FC2A060
0000000000000000: 10001c00 01000000 42424242 42424242 †........BBBBBBBB
0000000000000010: 42424141 41414141 41414141 030000††††BBAAAAAAAAAA...
다시, 낄낄 거림을 위해 데이터 파일의 16 진수 덤프를 확인하십시오.
레코드 분석에서 설명 하는 것처럼 레코드 의 고정 길이 및 가변 길이 열은 별개의 블록에 저장됩니다. 논리적으로 인터리빙 고정 및 가변 열 유형은 물리적 레코드와 관련이 없습니다. 그러나 각 블록 내에서 열 순서는 데이터 파일의 바이트 순서로 매핑됩니다.
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
참조 :
열 순서는 중요하지 않지만 일반적으로 – IT DEPENDS!
CREATE TABLE
명령문에 따른다는 것을 항상 발견했습니다 (CI 키 열이 섹션에서 먼저 오는 것을 제외하고).ALTER COLUMN
데이터 유형 / 열 길이 가 변경되면 열 순서가 변경 될 수 있습니다 . 내가 생각할 수있는 유일한 사소한 경우는 빈 길이의 문자열 또는 NULL을 가진 가변 길이 섹션의 끝에있는 열이 열 오프셋 배열에서 공간을 전혀 차지하지 않는다는 것입니다 (2008 내부 책에서 Kalen Delaney에 의해 입증 됨)