실무 적용 SQL 성능 튜닝
튜닝 방법론 및 SQL 처리 구조
튜닝 방법론 및 SQL 처리 구조
TUNING의 개요
- 정상적인 성능을 제공하던 오라클 데이터베이스가 SELECT, UPDATE, INSERT, DELETE 문을 실행 했더니 갑자기 실행 속도가 너무 떨어져서 운영에 어려움을 겪게 되는 것을 경험할 수 있게 되는데 이런 경우 튜닝을 통해 성능이 향상될 수 있도록 하는 것
시스템 성능 저하의 주요인
- 대부분의 성능저하 주요인은 DB관련 비효율
- SQL관련 부분과 DB설계가 전체의 70% 차지
- 성능저하 문제의 핵심은 CPU/Memory 부하가 아닌 비효율적인 I/O
- SQL활용 및 DB설계능력이 성능관점에서 중요
SQL 성능 저하의 원인
- 오래되거나 누락된 옵티마이저 통계
- 누락된 엑세스 구조
- 최적 상태가 아닌 실행 계획 선택
- 잘못 작성된 SQL
비효율적인 SQL Example
조회조건 컬럼의 외부적인 변형
SELECT * FROM EMP WHERE SUBSTR(ENAME, 1, 3) = 'JOE'
↓ TUNING 을 통해 성능을 향상시킬 수 있는 방법
SELECT * FROM EMP WHERE LIKE 'JOE%'
Data Type 불일치
SELECT * FROM DEPT WHERE DEPTNO = :IN_DEPTNO
-- 조건) DEPTNO - CHAR(3), IN_DEPTNO - NUMBER형 BIND 변수
↓ 실제 rewrite 되는 SQL
SELECT * FROM DEPT WHERE TO_NUMBER(DEPTNO) = :IN_DEPTNO
↓ TUNING 을 통해 성능을 향상시킬 수 있는 방법
SELECT * FROM DEPT WHERE DEPTNO = LPAD(TO_CHAR(:IN_DEPTNO), 3, '0')
:IN_DEPTNO BIND 변수를 CHAR 형으로 선언하여 사용하는 것이 더 좋다
Correlated subquery(상관 관계가 있는 하위 쿼리)
- 제품 정가가 평균 제품 가격보다 15% 이상 낮은 제품의 수를 확인하는 SQL
SELECT COUNT(*) FROM products p WHERE prod_list_price < 1.15 * (SELECT AVG(unit_cost) FROM costs c WHERE c.prod_id = p.prod_id)
↓ TUNING 을 통해 성능을 향상시킬 수 있는 방법
SELECT COUNT(*) FROM products p , (SELECT prod_id ,AVG(unit_cost) ac FROM costs GROUP BY prod_id) c WHERE p.prod_id = c.prod_id AND p.prod_list_price < 1.15 * c.ac
OPTIMIZER
- 사용자는 요구만 하고 OPTIMIZER가 실행계획 수립
- 수립된 실행계획에 따라 엄청난 수행속도 차이발생
- 실행계획 제어가 어렵다
- OPTIMIZER가 좋은 실행계획을 수립할 수 있도록 종합적이고 전략적인 FACTOR를 부여
- 비절차형으로 기술해야 함
- 집합적으로 접근해야 함