Contents
see List작성일 2025. 11. 30.
Oracle 성능 튜닝 기초 가이드
Oracle 데이터베이스 성능 최적화를 위한 실행계획 분석, 인덱스 활용, 쿼리 튜닝 기법을 다룹니다.
1. 실행계획 확인
-- EXPLAIN PLAN
EXPLAIN PLAN FOR
SELECT * FROM tb_order WHERE customer_id = 100;
SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY);
-- AUTOTRACE
SET AUTOTRACE ON;
SELECT * FROM tb_order WHERE customer_id = 100;
SET AUTOTRACE OFF;
-- 실제 실행 통계
SELECT /*+ GATHER_PLAN_STATISTICS */ *
FROM tb_order WHERE customer_id = 100;
SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY_CURSOR(NULL, NULL, "ALLSTATS LAST"));2. 실행계획 읽기
주요 오퍼레이션:
- TABLE ACCESS FULL: 전체 테이블 스캔 (대량 조회 시 비효율)
- INDEX RANGE SCAN: 인덱스 범위 스캔 (효율적)
- INDEX UNIQUE SCAN: 유일값 조회 (가장 효율적)
- NESTED LOOPS: 중첩 루프 조인 (소량 데이터)
- HASH JOIN: 해시 조인 (대량 데이터)
- SORT MERGE JOIN: 정렬 병합 조인3. 인덱스 생성
-- 단일 컬럼 인덱스
CREATE INDEX idx_customer_id ON tb_order(customer_id);
-- 복합 인덱스 (순서 중요)
CREATE INDEX idx_order_comp ON tb_order(customer_id, order_date);
-- 인덱스 사용 확인
SELECT index_name, column_name, column_position
FROM user_ind_columns
WHERE table_name = "TB_ORDER"
ORDER BY index_name, column_position;4. 인덱스 활용 안 되는 경우
-- 1. 컬럼 변형
WHERE SUBSTR(name, 1, 3) = "홍길" -- X
WHERE name LIKE "홍길%" -- O
-- 2. 묵시적 형변환
WHERE phone_no = 01012345678 -- X (숫자)
WHERE phone_no = "01012345678" -- O (문자)
-- 3. NULL 비교
WHERE column IS NULL -- 인덱스 사용 안됨
-- 4. 부정형
WHERE status != "DONE" -- 인덱스 사용 안됨
-- 5. OR 조건
WHERE col1 = "A" OR col2 = "B" -- 주의 필요5. 힌트 사용
-- 인덱스 강제 사용
SELECT /*+ INDEX(o idx_customer_id) */ *
FROM tb_order o
WHERE customer_id = 100;
-- Full 스캔 강제
SELECT /*+ FULL(o) */ * FROM tb_order o;
-- 조인 방식 지정
SELECT /*+ USE_NL(o c) */ o.*, c.name
FROM tb_order o
JOIN tb_customer c ON o.customer_id = c.id;
-- 병렬 처리
SELECT /*+ PARALLEL(o, 4) */ * FROM tb_order o;6. 통계 정보 갱신
-- 테이블 통계 수집
EXEC DBMS_STATS.GATHER_TABLE_STATS("SCOTT", "TB_ORDER");
-- 스키마 전체 통계
EXEC DBMS_STATS.GATHER_SCHEMA_STATS("SCOTT");
-- 통계 확인
SELECT table_name, num_rows, last_analyzed
FROM user_tables
WHERE table_name = "TB_ORDER";7. 쿼리 튜닝 체크리스트
| 항목 | 점검 내용 |
|---|---|
| WHERE 조건 | 인덱스 컬럼 사용 여부 |
| SELECT | 필요한 컬럼만 조회 |
| 조인 | 조인 순서, 방식 적절성 |
| 서브쿼리 | 조인으로 대체 가능 여부 |
| 정렬 | ORDER BY 인덱스 활용 |
| 통계 | 최신 통계 정보 여부 |
8. AWR 리포트
-- AWR 스냅샷 생성
EXEC DBMS_WORKLOAD_REPOSITORY.CREATE_SNAPSHOT;
-- AWR 리포트 생성
@?/rdbms/admin/awrrpt.sqldatabase
| No | 작성일 | Title |
|---|---|---|
| 3380 | 2026. 08. 20. | PostgreSQL 느린 조회를 진단하는 방법: EXPLAIN ANALYZE와 복합 인덱스 실전 가이드 |
| 3348 | 2026. 08. 11. | PostgreSQL 잠금 대기 줄이기: 트랜잭션 범위와 lock_timeout 설정 실전 가이드 |
| 3316 | 2026. 08. 03. | PostgreSQL 백업 복구 실전 가이드: pg_dump·pg_restore로 장애 복구 절차 만들기 |
| 3284 | 2026. 07. 26. | PostgreSQL 인덱스가 있는데도 느린 쿼리 해결하기: EXPLAIN ANALYZE와 복합 인덱스 설계 |
| 3254 | 2026. 07. 18. | PostgreSQL 잠금 대기 진단 가이드: pg_stat_activity로 블로킹 쿼리 찾고 장애 줄이기 |
| 3202 | 2026. 07. 09. | PostgreSQL 백업 복구 검증 가이드: pg_dump와 psql로 실제 복원까지 확인하기 |
| 3170 | 2026. 07. 01. | MySQL 느린 쿼리 원인 찾기: EXPLAIN과 복합 인덱스 점검 가이드 |
| 3116 | 2026. 06. 23. | PostgreSQL 트랜잭션 충돌 줄이기: 잠금 순서와 짧은 재시도로 데드락 대응하기 |
| 3058 | 2026. 06. 15. | PostgreSQL JSONB 조회 튜닝: GIN 인덱스와 생성 컬럼으로 느린 검색 줄이기 |
| 2971 | 2026. 06. 07. | MySQL/MariaDB 복합 인덱스 설계: 느린 목록 조회를 줄이는 WHERE·ORDER BY 점검법 |