SQL 최적화 복습
이번에는 1장에서 학습한 내용을 돌아보며, 중요한 개념과 처음 느꼈던 점들을 정리해보려 한다.
작년 겨울, 한 컨퍼런스에서 성장하는 방법에 대한 이야기를 들은 적이 있다. 그중 기억에 남는 말이 "학습한 정보를 일부러 어렵게 떠올리는 연습을 하면 기억이 더 오래 남는다."는 것이었다. 지금 복습하는 과정도 마찬가지다. 이전에 배운 내용을 다시 떠올리고 정리하면서, 더 깊이 이해하고 오래 기억할 수 있도록 해보려 한다.
먼저, SQL 성능을 개선하기 위해 꼭 기억해야 할 핵심 개념을 정리하고, 이에 대한 설명을 덧붙여 보겠다.
SQL 최적화에서 가장 중요한 점
-
SQL 실행 성능을 결정하는 가장 중요한 요소는 I/O이다.
- SQL이 느려지는 가장 큰 이유는 디스크 I/O 병목 때문이다.
- I/O 최적화 = SQL 튜닝이라고 해도 과언이 아니다.
-
SQL 실행 과정에서 옵티마이저의 역할이 핵심이다.
- SQL 실행 전 옵티마이저(Optimizer) 가 최적의 실행 계획을 선택한다.
- 실행 계획을 분석하면 SQL이 어떻게 실행될지 예상할 수 있다.
-
하드 파싱을 최소화하고 SQL 공유 및 재사용이 중요하다.
- 소프트 파싱을 늘리기 위해 라이브러리 캐시 활용
- 바인드 변수를 사용하여 동일 SQL을 공유해 불필요한 최적화 비용을 줄인다.
-
인덱스가 항상 정답은 아니다.
- 소량 데이터 조회에는 인덱스를 사용하는 것이 좋다. (Single Block I/O)
- 대량 데이터 조회에는 Table Full Scan이 더 효율적일 수 있다. (Multiblock I/O)
- 인덱스 조회가 무조건 빠르다고 맹신하지 말자!
-
버퍼 캐시를 활용한 논리적 I/O 최적화가 중요하다.
- 디스크 I/O를 줄이려면, 논리적 I/O를 먼저 줄여야 한다.
- DB 버퍼 캐시를 활용하여 자주 조회하는 데이터를 메모리에 유지
SQL 실행 과정 요약
- SQL 파싱 → 문법·의미 분석 및 파싱 트리 생성
- SQL 최적화 → 실행경로 후보 비교 후 최적 실행계획 선택
- 로우 소스 생성 → 실행계획을 실제 실행 가능한 코드로 변환
- 실행계획 확인 → 예상 비용과 실행 방식 검토 가능
- 옵티마이저 힌트 사용 (필요시) → 최적 실행을 위해 강제 경로 지정
SQL 성능 최적화를 위해
- 소프트 파싱 비율을 높이기 위해 라이브러리 캐시 활용
- 하드 파싱을 최소화하기 위해 바인드 변수 사용
- 불필요한 SQL 변형을 줄이고 공유 가능한 SQL 구조 설계
SQL 실행 및 최적화 개념 정리
| 개념 | 설명 |
|---|
| 데이터 블록 (Block) | 데이터를 읽고 쓰는 최소 단위 |
| 익스텐트 (Extent) | 공간을 확장하는 단위 (연속된 블록 집합) |
| 세그먼트 (Segment) | 테이블, 인덱스, 파티션, LOB 등 데이터 저장공간이 필요한 오브젝트 |
| 테이블스페이스 (TableSpace) | 세그먼트를 담는 컨테이너 |
| 데이터파일 (Data File) | 디스크 상의 물리적인 OS 파일 |
Single Block I/O vs Multiblock I/O
- Single Block I/O : 한 번의 I/O Call로 한 개 블록만 읽음 (인덱스 조회에 적합)
- Multiblock I/O : 한 번의 I/O Call로 여러 개의 블록을 읽음 (테이블 풀 스캔에 적합)
Table Full Scan vs Index Range Scan
- Table Full Scan : 테이블 전체 블록을 연속적으로 읽음 (Multiblock I/O 사용).
- Index Range Scan : 인덱스를 통해 필요한 블록을 개별적으로 접근 (Single Block I/O 사용).
소량 데이터 조회 → 인덱스 활용 (Single Block I/O) 대량 데이터 조회 → Table Full Scan + Multiblock I/O 활용
최적의 SQL 튜닝 전략
✔ I/O를 최소화하는 것이 SQL 성능 최적화의 핵심!
✔ 논리적 I/O 자체를 줄여야 물리적 I/O도 줄일 수 있음.
✔ 작은 데이터 조회 → 인덱스 활용 (Single Block I/O)
✔ 대량 데이터 조회 → Table Full Scan + Multiblock I/O 활용
✔ 버퍼캐시 활용도를 높이고, 캐시 경합을 최소화하는 SQL 튜닝 필요.
SQL 성능 최적화 = I/O 최적화!