SQL 튜닝

2 분 소요

현업에서 sql 튜닝을 위해 문제 쿼리들을 살펴보게 되면 대부분 인덱스와 조인 문제가 대부분 발생한다. 인덱스의 경우는 WHERE 조건 컬럼에 인덱스가 걸려있지 않는 문제가 있고, 조인의 경우 조인 순서에 따라 문제가 발생하는 경우가 많다.

인덱스

  • 조건절에서 비교하는 컬럼에 인덱스가 없는 경우
  • 조인 조건으로 사용된 컬럼에 인덱스가 없는 경우
  • 스칼라 서브쿼리의 조인 조건으로 사용된 컬럼에 인덱스가 없는 경우
  • START WITH, PRIOR 구문에서 사용한 컬럼에 인덱스가 없는 경우
  • 조건절에서 사용한 컬럼의 내/외부 변형으로 인덱스를 사용할 수 없는 경우
  • IS NULL, IS NOT NULL을 사용한 비교로 인덱스를 사용할 수 없는 경우
  • LIKE로 비교하는 값의 앞에 %를 사용하여 인덱스를 사용할 수 없는 경우
  • OR로 연결된 조건 비교로 인덱스를 사용할 수 없는 경우
  • MINUS 구문 사용으로 인덱스를 사용할 수 없는 경우
  • 부정형 비교로 인덱스를 사용할 수 없는 경우

조인

  • 드라이빙 테이블을 잘못 선정하여 비용이 증가한 경우
  • 비효율적인 조인 순서 채택으로 비용이 증가한 경우
  • 조인 후 GROUP BY 수행으로 비용이 증가한 경우
  • HASH JOIN으로 비용이 증가한 경우
  • NESTED LOOP JOIN으로 비용이 증가한 경우
  • MERGE JOIN으로 비용이 증가한 경우
  • 비효율적인 원격 조인으로 비용이 증가한 경우

애플리케이션 로직

  • 대량 데이터 삭제 작업으로 비용이 증가한 경우
  • 무한루프 로직 사용으로 비용이 증가한 경우
  • COMMIT 결여로 데이터 정합성이 손실될 가능성이 있는 경우
  • 비효율적 트리거 구현으로 비용이 증가한 경우(INSERT -> UPDATE, DELETE -> INSERT)
  • 비효율적인 배치 처리로 비용이 증가한 경우

업무 요건

  • 업무 요건에서 조회 결과 건수가 과다한 경우
  • 대량 데이터에 대한 집계 처리를 수행하는 경우
  • 데이터 출력 화면의 페이지 계산을 위한 COUNT 수행으로 비용이 증가한 경우

함수 뷰/인라인뷰 서브쿼리

  • IF 조건절 및 함수를 과다하게 사용한 경우
  • 뷰의 MERGE 또는 NO_MERGE 처리로 비용이 증가한 경우
  • 서브쿼리의 UNNEST 처리로 비효율적인 실행 계획을 세운 경우
  • 인라인뷰 사이의 결과값 활용이 불가능해진 경우
  • 인라인뷰의 GROUP BY절에서 사용된 컬럼의 인덱스를 사용하지 않는 경우
  • 뷰를 목적으로 적합하게 활용하지 않은 경우
  • 조회 대상 건수가 많은 스칼라 서브쿼리를 사용한 경우

SQL 구문 오류

  • OURER JOIN 을 잘못 사용한 경우
  • 과도한 HAED PARSING을 유발한 경우
  • 힌트를 잘못 사용한 경우

기타

  • COUNT 시 불필요한 연산을 수행하는 경우
  • 동일 테이블에 대한 중복 접근으로 처리 비용이 증가한 경우
  • 최대값 및 최소값 추출 시 테이블 전체를 검색하는 경우
  • GROUP BY를 포함한 뷰 처리 시 테이블 전체를 검색하는 경우
  • DISTINCT 구문 사용으로 테이블 전체를 검색하는 경우
  • UNION ALL 구문 사용으로 테이블 전체를 검색하는 경우
  • 정렬 작업을 위해 테이블 전체를 검색하는 경우
  • 데이터의 유무 검사를 위한 COUNT시 테이블 전체를 검색하는 경우
  • ANALYTIC FUNCTION 사용으로 테이블 전체를 검색하는 경우
  • 낮은 조인 성공률로 부분 범위 처리 효과가 미미한 경우

객체 관리

  • HWM(High Water Mark) 증가로 인해 불필요한 블록을 검색하는 경우
  • 통계 정보 부정확으로 인해 실행 계획에 이상이 생긴 경우
  • 인덱스가 사용 불가한 상태로 변한 경우
  • 테이블 단편화로 인해 불필요한 블록을 검색하는 경우

태그:

카테고리:

업데이트:

댓글남기기