안녕하세요.
DBCC PAGE 정보를 보다보니 궁금한게 생겼는데요..
char(1)일때와 varchar(1) 일때의 PAGE내에 slot정보를 보니
Record size가 틀린게 Recrode Attributes 에 VARIABLE_COLUMNS 부분이 추가되고
3bytes정도가 varchar(1)일때 row마다 더 증가하던데
저 VARIABLE_COLUMNS 부분과 3Bytes가 연관된계 맞는건지요..?
3Bytes내에서는 어떤 작업이 일어나는지 궁금한데
제가 검색이 안되는건지 찾아보기가 힘드네요~^^;
(1byte는 0x00, 2byte는 Prefix에 대한 부분이네요 ^^;;)
아..그리고 varchar(1)인 경우 slot내에 값 중 문자끝에 0x00(NULL) 값이 붙질 않던데...
별다른 이유가 있나요~?
(아..3bytes중에 1bytes는 0x00인 것 같네요)
--char(1)인경우--
m_pageId = (1:11314347) m_headerVersion = 1 m_type = 1
m_typeFlagBits = 0x0 m_level = 0 m_flagBits = 0x8000
m_objId (AllocUnitId.idObj) = 6185 m_indexId (AllocUnitId.idInd) = 256
Metadata: AllocUnitId = 72057594443268096
Metadata: PartitionId = 72057594434355200 Metadata: IndexId = 0
Metadata: ObjectId = 799341912 m_prevPage = (0:0) m_nextPage = (0:0)
pminlen = 5 m_slotCnt = 1 m_freeCnt = 8085
m_freeData = 105 m_reservedCnt = 0 m_lsn = (300769:30976:23)
m_xactReserved = 0 m_xdesId = (0:0) m_ghostRecCnt = 0
m_tornBits = 0 DB Frag ID = 1
Allocation Status
GAM (1:11247104) = ALLOCATED SGAM (1:11247105) = ALLOCATED
PFS (1:11307024) = 0x61 MIXED_EXT ALLOCATED 50_PCT_FULL DIFF (1:11247110) = CHANGED
ML (1:11247111) = NOT MIN_LOGGED
Slot 0 Offset 0x60 Length 9
Record Type = PRIMARY_RECORD Record Attributes = NULL_BITMAP Record Size = 9
Memory Dump @0x0000000027EEA060
0000000000000000: 10000500 41010000 00 ....A....
--varchar(1)인경우--
m_pageId = (1:9518421) m_headerVersion = 1 m_type = 1
m_typeFlagBits = 0x0 m_level = 0 m_flagBits = 0x8000
m_objId (AllocUnitId.idObj) = 6182 m_indexId (AllocUnitId.idInd) = 256
Metadata: AllocUnitId = 72057594443071488
Metadata: PartitionId = 72057594434158592 Metadata: IndexId = 0
Metadata: ObjectId = 719341627 m_prevPage = (0:0) m_nextPage = (0:0)
pminlen = 4 m_slotCnt = 1 m_freeCnt = 8082
m_freeData = 108 m_reservedCnt = 0 m_lsn = (300769:30888:23)
m_xactReserved = 0 m_xdesId = (0:0) m_ghostRecCnt = 0
m_tornBits = 0 DB Frag ID = 1
Allocation Status
GAM (1:9202176) = ALLOCATED SGAM (1:9202177) = NOT ALLOCATED
PFS (1:9511488) = 0x61 MIXED_EXT ALLOCATED 50_PCT_FULL DIFF (1:9202182) = CHANGED
ML (1:9202183) = NOT MIN_LOGGED
Slot 0 Offset 0x60 Length 12
Record Type = PRIMARY_RECORD Record Attributes = NULL_BITMAP VARIABLE_COLUMNS
Record Size = 12
Memory Dump @0x0000000027EEA060
0000000000000000: 30000400 01000001 000c0041 0..........A
Comment 6
-
초짜해커
2015.04.01 11:27
-
dontcryme
2015.04.01 11:44
초짜해커 / 답변 감사합니다~^^
잠깐 헷갈리는데
답변해주신 부분은 VARCHAR의 끝에 0x00(데이터가 끝나는지점의 옵셋) 부분을 이야기 해주신것 같은데 맞나요~?
말씀주신데로라면 반대로 VARCHAR의 경우 'A'가 들어갔을 경우 데이터 끝에 00 (1byte) 가 들어가야 할 것 같은데
위에 PAGE 내용처럼 VARCHAR의 경우 끝에 00(1byte)가 빠지고, CHAR의 경우가 데이터 끝에 00(1byte)가 들어가서요~
NVARCHAR의 경우는 끝에 다시 00(1byte)가 붙는 것 같습니다.
소중한 답변 감사드려요~
-
초짜해커
2015.04.01 12:52
CHAR(1) 컬럼 하나뿐인거죠??
00은 가변길이 컬럼의 수 인거 같습니다.
동영상 보던거 다 보고.... 공부해서 알려드릴게요. -_-;;
첫 1BYTE는 Status Bits A입니다.
그 다음 1Byte는 Status Bits B입니다. 뭐하는건지 몰라요 -_-;;
그 다음 2Byte는 고정길이 데이터가 어디서 끝나는지를 나타내는 옵셋입니다.
--* 그리고 나서 고정길이 데이터들이 나옵니다.
그 다음 2Byte는 전체 컬럼 수 입니다.
그 다음이 조금 헛갈리는데.... 8개의 컬럼당 1바이트씩을 사용하여 NULL비트맵이나옵니다. 컬럼 하나라면 1BYTE를 사용하겠네요.
그 다음 2BYTE가 가변길이 컬럼의 수이고
그 이후로 가변컬럼 오프셋과 데이터들이 나옵니다.
질문하신 분이 궁금해하는 그 00이라는 부분은....
가변길이 컬럼의 수네요.
-
dontcryme
2015.04.01 13:19
네~
TEST삼아 CHAR(1), VARCHAR(1),NVARCHAR(1) 만 가지고 PAGE정보를 뿌려봤습니다.
답변 감사합니다.~
-
dontcryme
2015.04.01 14:35
소중한 답변 정말 감사드립니다.
괜히 저 때문에....시간을 ...감사드립니다.
언급하신 부분들로 인해 갑자기 기억이 나는게...'Data Record Struture' 관련 글 및
이곳 강좌란에서 본 것 같네요. ㅠㅠ
다시한번 시간내어 답변주셔서 감사드립니다.
-
dontcryme
2015.04.01 14:58
아 근데...말씀하신 부분들이...7 byte hidden overhead size에 대한 부분들 같은데....
헷갈려서 찾아보니 MSSQL SERVER 2012 Unleashed에 아래와 같은 내용이 있군요~
"If the table Contains any variable-columns, the following additional overhead bytes are included in each data rows"
- 2 bytes to store the number of variable-length columns in the row
....
감사합니다.~^^
하도 오래전에 본 내용들이라 기억도 안나고, 다시 공부하기도 귀찮고...
CHAR와 VARCHAR가 다른점은
CHAR는 CHAR(10)이라고 하면 10바이트를 꼭 차지하기 때문에 따로 데이터가 끝나는 지점을 명시할 필요가 없지만
VARCHAR의 경우는 VARCHAR(10)이라고 하더라도 데이터는 1바이트만 들어 있는 경우가 있어서 꼭 데이터가 끝나는 지점의 옵셋을 가지고 있습니다.