카테고리 없음
데이터 조작 프로시저 최적화
jjonse
2022. 9. 5. 16:27
(1) 쿼리 성능 개선의 개념
- 쿼리 성능 개선은 데이터베이스에서 프로시저에 있는 SQL 실행 계획을 분석, 수정을 통해 최소의 시간으로 원하는 결과를 얻도록 프로시저를 수정하는 작업이다.
- SQL 성능 개선을 통해 데이터 조작 프로시저의 성능 개선이 가능하다.
1. 쿼리 성능 개선 절차
- 문제 있는 SQL 식별 : 문제 있는 SQL을 식별하기 위해 애플리케이션의 성능을 관리 및 모니터링 도구인 APM 등을 활용
- 옵티마이저 통계 확인 : 옵티마이저는 개발자가 작성한 SQL을 가장 빠르고 효율적으로 수행할 최적의 처리경로를 생성해주는 데이터베이스 핵심 모듈
- SQL문 재구성 : 범위가 아닌 특정 값 지정으로 범위를 줄여 처리속도를 빠르게 함
- 인덱스 재구성 : 성능에 중요한 액세스 경로를 고려하여 인덱스 생성
- 실행계획 유지관리 : 데이터베이스 버전 업그레이드, 데이터 전환 등 시스템 환경의 변경 사항 발생 시에도 실행계획이 유지되고 있는지 관리
(2) 옵티마이저 통계 확인
- 옵티마이저는 SQL을 가장 빠르고 효율적으로 수행할 최적의 처리경로를 생성해주는 DBMS 내부의 핵심엔진이다.
- 옵티마이저가 생성한 SQL 처리경로를 실행계획이라고 부른다.
1. 옵티마이저의 유형
비교 | 규칙기반 옵티마이저(RBO) | 비용기반 옵티마이저(CBO) |
개념 | 통계 정보가 없는 상태에서 사전 등록된 규칙에 따라 질의 실행 계획을 선택하는 옵티마이저 | 통계 정보로부터 모든 접근 경로를 고려한 질의실행 계획을 선택하는 옵티마이저 |
핵심 | 규칙 기반 | 비용 기반 |
평가 기준 |
인덱스 구조, 연산자, 조건절 형태 등 | 레코드 개수, 블록 개수, 평균 행 길이, 컬럼 값의 수, 컬럼 값 분포, 인덱스 높이, 클러스터링 팩터 등 |
장점 | 사용자가 원하는 처리경로로 유도하기가 쉬움 | 옵티마이저의 이해도가 낮아도 성능보장 가능 |
2. SQL 수행과정 내 옵티마이저 역할
- 쿼리 변환 : SQL을 좀 더 일반적이고 표준화된 형태로 변환
- 비용 산정 : 쿼리 명령어 각 단계의 선택도, 카디널리티, 비용을 계산, 궁극적으로 실행계획 전체에 대한 총비용 계산
- 계획 생성 : 하나의 쿼리를 수행 시 후보군이 될 만한 실행계획들을 생성해내는 역할
3. 힌트 사용
- SQL 성능 개선의 핵심 부분으로 옵티마이저의 실행 계획을 원하는 대로 변경할 수 있게 한다.
- 옵티마이저가 항상 최선의 실행 계획을 수립할 수 없어 명시적인 힌트를 통해 실행계획을 변경한다.
▼ 힌트 사용 예시
SELECT /*+ RULE */ ENAME, SAL
FRON EMP
WHERE EMPNO > 9000;
-> 비용기반 옵티마이저에서 규칙기반 옵티마이저 모드로 변경 수행
▼주요 옵티마이저 힌트
- /*+ RULE */ : 규칙 기반 접근 방식을 사용하도록 지정
- /* +CHOOSE */ -> 오라클 옵티마이저 디폴트 값에 따름
- /*+INDEX(테이블명 인덱스명)*/ : 지정된 인덱스를 강제적으로 사용하도록 지정
- /*+USE_HASH(테이블명)*/ : 지정된 테이블들의 조인이 Hash Join 형식으로 일어나도록 유도
- /*+USE_MERGE(테이블명*/ : 지정된 테이블들의 조인이 Sort Merge 형식으로 일어나도록 유도
- /*+USE_NL(테이블명)*/ : 지정된 테이블들의 조인이 Nested Loop 형식으로 일어나도록 유도
(4) SQL 문 재구성
- 특정 값 지정 : 조건절의 '>' 또는 '<'가 아닌 '='을 사용, 범위가 아닌 특정 값 지정으로 인한 범위를 줄임
- 별도의 SQL 사용 : 다양한 작업에 대해 하나의 SQL문을 사용할 경우 각 작업에 최적화되지 않은 결과 발생, 하나의 SQL문 사용시 UNION ALL 연산자를 사용
- 힌트 사용 : 옵티마이저가 비정상적인 실행 계획을 수립 시 힌트로서 액세스 경로 및 조인 순서를 제어할 수 있도록 함
- HAVING 미사용 : 인덱스가 걸려있는 컬럼은 HAVING 사용 시 인덱스 미사용
- 인덱스만 질의 사용 : 가능한 인덱스만 이용해 질의를 수행하여 옵티마이저가 최적의 경로를 찾도록 유도함
(5) 인덱스 재구성
- 자주 쓰는 컬럼 선정 : 조건절에 항상 사용되거나, 자주 사용되는 컬럼 선정
- SORT 명령어 생략 : SORT 명령어를 생략하기 위한 컬럼을 추가
- 분포도를 고려 : 분포도가 좋은 컬럼은 단독으로 인덱스를 생성
- 변경 적은 컬럼 선정 : 데이터의 변경이 적은 컬럼에 인덱스를 생성
- 결합 인덱스 사용 : 인덱스들이 자주 조합될 때는 결합 인덱스를 생성