02.Oracle/DataBase2009. 11. 27. 15:34
반응형

SQL문 튜닝 개요

Added by honghoekim, last edited by honghoekim on 7월 31, 2009

Labels:

Enter labels to add to this page:
Wait Image 
Looking for a label? Just start typing.

1.문제가 있는 SQL 식별

1)느린 프로그램을 식별
2)프로그램에서 SQL을 검토
3)SQL_Trace 및 TKPROF를 사용

  • SQL문 식별이 불가능한 경우(SQL이 동적으로 생성되는 경우) SQL TRACE를 사용하여 실행된 SQL을 포함하는 Trace file을 생성한 다음 TKPROF를 사용하여 출력 파일을 생성

2.Optimizer 통계 확인

1)모든 테이블에 대한 통계를 수집

  • 모든 SQL문의 실행 계획을 결정하는 CBO는 테이블 및 인덱스에 대해 수집된 통계를 사용함.통계가 수집되지 않았거나 통계가 데이터베이스에 저장된 데이터를 대표하지 못할 경우 Optimizer에 정보가 부족해 최상의 계획을생성할 수 없다.

3.실행 계획 검토

다음 사항을 검토

1)Driving table이 최상의 필터를 가지는 계획이 되어야 한다.
2)각 단계의 조인 순서는 가장 적은 수의 행이 다음 단계로 반환됨을 의미 한다.
3)조인 방식이 반환되는 행 수에 적합.예를 들어 인덱스를 통한 중첩 루프 조인은 많은 행이 반환될 때 최적화되지 않을 수 있다.
4)뷰가 효율적으로 사용 된다.뷰에 대한 access 필요 여부 확인
5)작은 테이블에도 비의도적인 cartesian product가 없다.
6)각 테이블이 효율적으로 액세스 된다.

4.SQL문 재구성

1)AND 및 = 를 사용
2)WHERE절에 변환된 열이 포함되지 않도록 함

  • 술어 절 또는 WHERE절에 SQL 함수 사용 금지
    3)복합 모드 표현식을 빼고 암시적인 유형 변환에 유의
    4)각 작업에 대해 별도의 SQL문을 작성
  • 다양한 작업에 대해 하나의 SQL문을 사용할 경우 각 작업에 최적화 되지 않은 결과 나옴.굳이 하나의 SQL문을 사용해야 할 경우 UNION ALL 연산자를 사용
    5)서브 쿼리에 대해 IN 대신 EXISTS를 사용
    -선택적 술어가 서브 쿼리에 있는 경우는 IN을 사용.선택적 술어가 상위 쿼리에 있는 경우는 EXISTS를 사용
    6)힌트로 엑세스 경로 및 조언 순서를 제어
    -인덱스를 통해 필요한 행을 얻는 것이 더 효율적인 경우 전체 테이블 스캔 사용 금지,
    더 적은 수의 행을 Fetch하는 다른 인덱스를 대신 사용할 수 있다면 Driving 테이블에서 많은 수의 행을 Fetch하는 인덱스의 사용을 피하자,
    조인 순서에서 나중에 테이블에 적은 수의 행을 조인하는 조인 순서를 선택

5.인덱스 재구성

1)비선택적 인덱스를 제거하여 DML 속도를 높임
2)성능에 중요한 액세스 경로를 인덱스화함
3)기존에 연결된 인덱스에서 열 순서를 변경
4)인덱스에 열을 추가하여 선택성을 높임
5)IOT를 고려

6.시간 경과에 따른 실행 계획 유지 관리


출처 : http://www.javastudy.co.kr:8080/pages/viewpage.action?pageId=786591

Posted by 1010