SQL

[오라클] Catalog, 통계정보, Undo Retention

class="song" 2026. 2. 19.

Catalog

- DB에 어떤 테이블이 있고, 유저는 누구며, 권한은 뭐가 있는지 적힌 총괄 장부
- 역할
    - DB의 설계도이자 메타데이터 저장소

- 특징
    - 사용자가 테이블을 만들거나, 권한을 주면 오라클이 알아서 이 장부에 기록
    - dba_objects나 user_tables 같은 뷰들이 카탈로그를 보여주는 창문
    - 깨지면 DB가 가동되지 않음

통계정보(Statistics)

- 테이블에 데이터가 몇 건 있고, 인덱스는 잘 정리돼 있는지 분석한 상태 보고서
- 역할
    - 옵티마이저(CBO: Cost Base Optimizer)가 가장 빠른 실행계획을 찾도록 도와줌

- 컬럼 통계
    - Distinct Value: 중복을 제거한 값의 개수
    - Null 값의 개수: 인덱스를 탈지 말지 결정하는 중요 요소
    - 히스토그램(Histogram): 데이터가 한쪽으로 쏠려있는지(Skewness)
        - 예시: 서울사는 사람이 90%, 제주가 1%면 서울 검색할 땐 인덱스 안타고 풀스캔이 빠르다고 판단
    - 인덱스 통계: Clustering Factor(군집 계수): 데이터가 물리적으로 얼마나 정렬되어 모여있는지 나타내는 수치(튜닝의 핵심)

- 필요한 이유
    - 데이터가 적을 때와 많을 때 검색 방법이 달라야 함
    - 매번 데이터를 세어볼 수 없으니, 미리 조사해둔 통계정보를 보고 실행계획을 결정

- 갱신 시점
    - 자동: 오라클 19c는 밤10시~새벽6시에 자동으로 통계정보를 수집함
    - 수동: 대량의 데이터를 INSERT하거나 마이그레이션 한 직후에는 수동으로 돌려줘야 함
        ```
            EXEC
            DBMS_STATS.GATHER_TABLE_STATS(OWNNAME=>'SCOTT', TABNAME=>'EMP');
        ```

Undo Retention - ctrl+z 유효 시간

- 실수했을 때나 과거 데이터를 조회할 때를 대비해 지워진 데이터를 보관하는 시간
- 역할
    - 읽기 일관성(Read consystency): 1시간 걸리는 조회 쿼리를 날렸을 때, 중간에 데이터가 바뀌어도 쿼리 시작 시점의 데이터를 보여줌
    - 롤백(Rollback): 트랜잭션 중 에러가 나거나 취소할 때 원상복구
    - Flashback Query: 과거를 조회할 때 씀


- 중요한 이유
    - (ORA-01555: Snapshot too old)에러는 DBA를 가장 괴롭히는 에러 중 하나
    - 상황
        1. 전체 매출 조회 쿼리를 날림
        2. 중간에 테이블의 데이터를 수정하고 커밋함
            - 이때 수정 전 데이터는 Undo에 들어감
            - 그런데 Undo 공간이 부족해서 덮어씌워짐
        3. 전체 조회 쿼리가 돌다가 수정한 데이터를 만나 Undo를 참조하는데 데이터는 이미 지워짐 -> 에러발생&쿼리 멈춤

- 대응
    - Undo Retention 시간을 늘려줌
        - 기본 900초 -> 10800초 이상 권장
    - Undo Tablespace의 크기 자체를 넉넉하게 늘려줌

- 조회 쿼리
        SELECT name, value
        FROM v$parameter
        WHERE name = 'undo_retention';

댓글