카테고리 없음

데이터 조작 프로시저 최적화

jjonse 2022. 9. 5. 16:27

(1) 쿼리 성능 개선의 개념

- 쿼리 성능 개선은 데이터베이스에서 프로시저에 있는 SQL 실행 계획을 분석, 수정을 통해 최소의 시간으로 원하는 결과를 얻도록 프로시저를 수정하는 작업이다.

- SQL 성능 개선을 통해 데이터 조작 프로시저의 성능 개선이 가능하다.

 

1. 쿼리 성능 개선 절차

  1. 문제 있는 SQL 식별 : 문제 있는 SQL을 식별하기 위해 애플리케이션의 성능을 관리 및 모니터링 도구인 APM 등을 활용
  2. 옵티마이저 통계 확인 : 옵티마이저는 개발자가 작성한 SQL을 가장 빠르고 효율적으로 수행할 최적의 처리경로를 생성해주는 데이터베이스 핵심 모듈
  3. SQL문 재구성 : 범위가 아닌 특정 값 지정으로 범위를 줄여 처리속도를 빠르게 함
  4. 인덱스 재구성 : 성능에 중요한 액세스 경로를 고려하여 인덱스 생성
  5. 실행계획 유지관리 : 데이터베이스 버전 업그레이드, 데이터 전환 등 시스템 환경의 변경 사항 발생 시에도 실행계획이 유지되고 있는지 관리

 

(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 문 재구성

  1. 특정 값 지정 : 조건절의 '>' 또는 '<'가 아닌 '='을 사용, 범위가 아닌 특정 값 지정으로 인한 범위를 줄임
  2. 별도의 SQL 사용 : 다양한 작업에 대해 하나의 SQL문을 사용할 경우 각 작업에 최적화되지 않은 결과 발생, 하나의 SQL문 사용시 UNION ALL 연산자를 사용
  3. 힌트 사용 : 옵티마이저가 비정상적인 실행 계획을 수립 시 힌트로서 액세스 경로 및 조인 순서를 제어할 수 있도록 함
  4. HAVING 미사용 : 인덱스가 걸려있는 컬럼은 HAVING 사용 시 인덱스 미사용
  5. 인덱스만 질의 사용 : 가능한 인덱스만 이용해 질의를 수행하여 옵티마이저가 최적의 경로를 찾도록 유도함

 

(5) 인덱스 재구성

  • 자주 쓰는 컬럼 선정 : 조건절에 항상 사용되거나, 자주 사용되는 컬럼 선정
  • SORT 명령어 생략 : SORT 명령어를 생략하기 위한 컬럼을 추가
  • 분포도를 고려 : 분포도가 좋은 컬럼은 단독으로 인덱스를 생성
  • 변경 적은 컬럼 선정 : 데이터의 변경이 적은 컬럼에 인덱스를 생성
  • 결합 인덱스 사용 : 인덱스들이 자주 조합될 때는 결합 인덱스를 생성