메뉴 여닫기
개인 메뉴 토글
로그인하지 않음
만약 지금 편집한다면 당신의 IP 주소가 공개될 수 있습니다.
Oracle (토론 | 기여)님의 2025년 9월 11일 (목) 12:05 판 (새 문서: = Oracle 컬럼의 물리적 구조 = == 개요 == Oracle Database에서 컬럼의 '''물리적 저장 구조'''는 성능과 저장 효율성에 직접적인 영향을 미치는 핵심 아키텍처 요소입니다. 이 문서는 '''DBA 및 데이터베이스 전문가'''를 대상으로 컬럼의 바이트 레벨 저장 구조부터 성능 최적화까지 상세히 다룹니다. == Row Format Architecture == === Row Header Structure (3 bytes) === {| class="wikitable" ! Byt...)
(차이) ← 이전 판 | 최신판 (차이) | 다음 판 → (차이)

Oracle 컬럼의 물리적 구조

개요

Oracle Database에서 컬럼의 물리적 저장 구조는 성능과 저장 효율성에 직접적인 영향을 미치는 핵심 아키텍처 요소입니다. 이 문서는 DBA 및 데이터베이스 전문가를 대상으로 컬럼의 바이트 레벨 저장 구조부터 성능 최적화까지 상세히 다룹니다.

Row Format Architecture

Row Header Structure (3 bytes)

Byte Position Field Description Bit Layout
Byte 0 Row Flags 행 상태 정보 8 bits
Byte 1-2 Column Count + Flags 저장된 컬럼 수 및 추가 플래그 16 bits

Row Flags (Byte 0) 상세 분석:

Bit 0: Row is deleted (삭제된 행)
Bit 1: Row is locked (행 잠금)
Bit 2: Row has migrated (행 이주)
Bit 3: Row is head of row piece chain (체인 헤드)
Bit 4: Row is clustered table member (클러스터 테이블 멤버)
Bit 5-7: Reserved for future use

Column Length Array

Oracle은 Variable Length Array 방식으로 각 컬럼의 길이 정보를 저장합니다:

  • NULL 컬럼: Length Array에서 완전히 제외
  • Non-NULL 컬럼: 1바이트 길이 정보 (최대 250바이트)
  • 대용량 컬럼: 3바이트 확장 길이 정보
Length Encoding Rules:
- 0x00-0xFA (0-250): 직접 길이 값
- 0xFB-0xFE: 확장 길이 인코딩
- 0xFF: NULL 값 (실제로는 저장되지 않음)

Data Type별 물리적 저장 구조

NUMBER 데이터 타입

Oracle의 NUMBER 타입은 독특한 Binary Coded Decimal (BCD) 변형을 사용합니다:

저장 바이트 설명
0 0x80 특수한 zero 표현
1-99 2-3 바이트 지수 + 가수부
100-9999 3-4 바이트 지수 + 가수부
매우 큰 수 최대 22바이트 Oracle 내부 정밀도 한계

NUMBER 인코딩 알고리즘:

1. Sign bit 처리
2. Exponent calculation (bias 193 for positive, bias 62 for negative)
3. Mantissa encoding (base-100 digit pairs)
4. Trailing zero elimination

VARCHAR2 vs CHAR 저장 차이점

데이터 타입 저장 방식 Trailing Spaces Length Encoding
VARCHAR2 Variable 제거됨 Actual length only
CHAR Fixed 보존됨 Declared length
NVARCHAR2 Variable 제거됨 UTF-16 byte length
NCHAR Fixed 보존됨 UTF-16 declared length

DATE와 TIMESTAMP 구조

DATE 타입 (7 바이트 고정):

Byte 1: Century + 100 (범위: 01-FF)
Byte 2: Year in century + 100 (범위: 01-64)
Byte 3: Month (범위: 01-0C)
Byte 4: Day (범위: 01-1F)
Byte 5: Hour + 1 (범위: 01-18)
Byte 6: Minute + 1 (범위: 01-3C)
Byte 7: Second + 1 (범위: 01-3C)

TIMESTAMP 확장 구조:

  • TIMESTAMP(6): DATE 7바이트 + Fractional seconds 4바이트
  • TIMESTAMP WITH TIME ZONE: 추가로 timezone 정보 2바이트
  • TIMESTAMP WITH LOCAL TIME ZONE: 내부적으로 UTC 저장

Column Ordering과 Performance Impact

물리적 배치 최적화 전략

권장 컬럼 순서:

  1. Primary Key (항상 NOT NULL, 고정 크기 선호)
  2. Foreign Keys (조인 성능 최적화)
  3. 자주 접근되는 NOT NULL 컬럼들 (WHERE절 조건)
  4. 선택적 고정 크기 컬럼들
  5. 가변 크기 컬럼들 (크기 순으로 정렬)
  6. 대용량 LOB 컬럼들 (별도 세그먼트 고려)

Row Access Path Analysis

컬럼 접근 시 Oracle의 내부 처리 과정:

1. Row Header 파싱 (3 바이트)
2. Target column의 테이블 정의상 위치 확인
3. Length Array 순차 스캔 (NULL 컬럼 건너뛰기)
4. Offset 계산 및 데이터 추출
5. 데이터 타입별 디코딩

성능 측정 지표:

  • Logical I/O: db block gets + consistent gets
  • CPU 사용량: 컬럼 접근 및 변환 비용
  • Memory 효율성: Buffer cache 활용도

Advanced Storage Concepts

Row Chaining과 Migration

Row Chaining 발생 조건:

  • Row 크기가 block 크기 초과
  • 초기 INSERT 시점에 이미 발생
  • 해결책: block 크기 증가 또는 테이블 분할

Row Migration 시나리오:

Before Update: [Block A] Row fits completely
After Update:  [Block A] Forwarding pointer → [Block B] Actual row data
Performance Impact: 2x I/O cost for row access

Compression과 컬럼 구조

Advanced Compression 영향:

  • Basic Compression: 블록 레벨 압축, 컬럼 순서 중요
  • OLTP Compression: 행 레벨 압축, 반복 패턴 최적화
  • Hybrid Columnar Compression: 컬럼 단위 압축, Exadata 전용
압축 타입 컬럼 순서 영향도 권장 사용처
BASIC 높음 Data Warehouse
OLTP 중간 OLTP 환경
HCC 낮음 Exadata 환경

Monitoring과 Diagnostics

Row 구조 분석 도구

DUMP 함수 활용:

SELECT DUMP(column_name, 16) FROM table_name;
-- 16진수 표현으로 internal 구조 확인

SELECT DUMP(column_name, 8, 1, 4) FROM table_name;  
-- 8진수, 1번째부터 4바이트까지 분석

Block Dump 명령어:

ALTER SYSTEM DUMP DATAFILE 4 BLOCK 1234;
-- Physical block structure 확인
-- alert log에서 덤프 결과 확인

Performance 모니터링 쿼리

Row Access Pattern 분석:

SELECT 
    sql_id,
    operation,
    object_name,
    cost,
    cardinality,
    access_predicates
FROM v$sql_plan 
WHERE object_name = 'TABLE_NAME'
  AND operation LIKE '%TABLE ACCESS%';

Block 사용량 통계:

SELECT 
    table_name,
    num_rows,
    blocks,
    avg_row_len,
    chain_cnt,
    ROUND(chain_cnt/num_rows*100, 2) as chain_pct
FROM user_tables
WHERE chain_cnt > 0;

실무 최적화 가이드라인

설계 단계 고려사항

테이블 설계 체크리스트:

  • NOT NULL 컬럼의 전방 배치 여부
  • 가변 길이 컬럼의 예상 크기 분포
  • Update 빈도가 높은 컬럼의 배치
  • 조인 키 컬럼의 데이터 타입 일치성
  • LOB 컬럼의 별도 저장 고려

운영 단계 모니터링

주기적 점검 항목:

  1. Row migration 비율 (>10%시 재구성 고려)
  2. Average row length 추이
  3. Block 사용률 (PCTFREE 조정)
  4. Index clustering factor (컬럼 순서 관련)

참고 자료

Oracle 내부 문서

  • Oracle Database Concepts - Physical Storage Structures
  • Oracle Database Performance Tuning Guide - Optimizing Data Access
  • Oracle Database Utilities - Data Pump 고급 옵션

진단 뷰 및 함수

  • V$SQL_PLAN: 실행계획 컬럼 접근 패턴
  • DBA_SEGMENTS: 세그먼트 크기 및 구조
  • DBMS_SPACE: 공간 사용량 분석
  • DBMS_ROWID: Row 물리적 위치 분석