2016. 12. 11. 22:19

오라클 힌트에 대해서 정리해보려고 합니다.

힌트라고 하는 것은 옵티마이져에게 사용자의 요구를 전달할 수 있는 중요한 보조 수단 입니다.


1.Optimizer 모드 제어 힌트

  가) ALL_ROWS 

       - 전체 결과의 최적화를 목표로 최저 비용의 실행계획을 수립하는 힌트 입니다.


  나) CHOOSE

      - 통계정보 유무에 따라 규칙기준 혹은 비용기준을 적용하여 최적화를 수행 합니다.

         (테이블 통계정보를 참조할 수 있는 경우 ALL_ROWS방식으로 처리됩니다.)


  다) FIRST_ROWS

     - 최적 응답시간을 목표로 최저 비용의 실행계획을 수힙합니다.


  라) RULE

     - 인덱스, 연산자 형태 등의 우선순위에 근거하는 규칙기준 옵티마이져를 이용한 최적화 입니다.



2. 조인순서 조정을 위한 힌트

  가) ORDERED

      - FROM 절에 기술된 테이블 순서대로 조인을 수행하도록 유도 하는 힌트 입니다.

      - LEADING 힌트와 함께 사용되면 LEADING 힌트는 무시됩니다.

      - 조인방법과는 무관하며, 조인방법 유도 힌트와 함께 사용하는 것이 일반적입니다.


  나) LEADING

      - FROM 절에 기술된순서와 상관없이 조인 순서를 제어 하는 힌트 입니다.

      - ORDERED 절 힌트와 달리 FROM 절을 변경하지 않아도 됩니다.

      - ORDERED 힌트와 함께 사용되면 무시됩니다.


3. 조인방법 선택을 위한 힌트

  가) USE_NL

      - Nested loops 방식을 사용 조인을 수행하는 힌트 입니다.

      - 대상 집합 간의 조인 방식을 지정합니다. 조인 순서와는 무관합니다.


  나) NO_USE_NL

      - 지정 테이블에 대해 Nested loops방식을 제외한 다른 방식의 조인 수행 하도록 유도하는 힌트 입니다.

      - 옵티마이져가 Nested loops 방식이 최적이라 판단할 경우 힌트가 무시 됩니다.


  다) USE_NL_WITH_INDEX

       - USER_NL과 INDEX 힌트의 통합 형태 입니다.


  라) USE_HASH 

      - 해쉬 방식으로 조인 수행하는 힌트입니다.

      - 옵티마이져가 통계정보를 토대로 빌드/검색 입력 결정을 합니다.

      - 빌드/검색 입력에 대한 옵티마이져 판단 문제시 ORDERED 힌트 병행사용 됩니다.


  마) NO_USE_HASH

     - 지정 테이블에 대해 HASH JOIN 방식을 제외한 다른 방식의 조인을 수행하도록 유도하는 힌트 입니다.


  바) USE_MERGE

     - SORT MERGE 방식으로 조인을 수행합니다.

     - 필요에 의해 ORDERED 힌트와 병행사용을 권장합니다.

 

  사) NO_USE_MERGE

    - 지정 테이블에 대해 SORT MERGE방식을 제외한 다른 방식의 조인을 수행하도록 유도하는 힌트 입니다.


3. 병렬처리 관련 힌트

  가) PARALLEL_INDEX

     - 파티션 인덱스(PARTITIONED INDEX)에 대해 인덱스 범위 스캔 병렬 처리하는 힌트 입니다.


  나) NOPARALLEL_INDEX

     - PARALLEL 파라메터가 인덱스에 지정된 경우, 병렬 인덱스 스킵 스캔을 하지 않습니다.

     - 버전에 따라 NO_PARALLEL_INDEX 힌트로 대체 가능 합니다.


  다) PQ_DISTRIBUTE

     - 병렬 조인 수행 속도 향상을 위해 사용합니다.

     - 슬레이브 프로세스 사이에서 조인할 테이블의 로우를 주고 받는 할당작업 방법 정의 합니다.


4. 액세스 수단 선택을 위한 힌트

  가) FULL

     - 전체 테이블 스캔 방식 수행


  나) HASH

     - 해쉬 클러스터 테이블 액세스시 해쉬 스캔방식 수행하는 힌트 입니다.


  다) CLUSTER

    - 클러스터링 테이블 액세스시 클러스터 인덱스 스캔 수행하는 힌트 입니다.


  라) INDEX

    - 인덱스 범위 스캔을 수행하는 힌트 입니다.

    - 뷰 액세스 쿼리의 경우 뷰 쿼리 내 테이블에 대한 인덱스 스캔 지정도 가능합니다.


  마) NO_INDEX

    - 지정한 인덱스를 제외하고 다른 액세스 방법으로 수행을 유도하는 힌트 입니다.

    - 테이블만 정의시 해당 테이블의 모든 인덱스를 제외합니다.


  바) INDEX_ASC

    - 지정한 인덱스 컬럼에 대해 컬럼값의 오름차순으로 범위 스캔 수행하는 인덱스 입니다.


  사) INDEX_DESC

    - 지정한 인ㄷ게스 컬럼에 대해 컬럼값이 내림차순으로 범위 스캔 수행하는 인덱스 입니다.


  ) INDEX_COMBINE

    - 2개 이상의 인덱스를 비트맵 인덱스로 변경/결합하여 액세스 수행 하는 인덱스 입니다.

    - 테이블명만 지정 시 옵티마이져가 해당 테이블의 적합한 인덱스를 선정하여 처리 합니다.


  자) INDEX_FFS

    - 인덱스 전체범위 스캔 수행 하는 인덱스 입니다. (다중 블록 스캔을 사용합니다.)

  

  카) NO_INDEX_FFS

    - 지정한 테이블의 인덱스에 대해 고속 전체 인덱스 스캔을 제외한 방식으로 수행 하는 인덱스 입니다.


  타) INDEX_JOIN

    - 2개 이상의 인덱스들만으로 조인을 수행하는 인덱스 입니다.

    - 인덱스 구성 컬럼이 해당질의에서 필요하는 모든 컬럼을 포함 해야 합니다.

    - 인덱스 범위 스캔 결과를 ROWID로 해쉬조인을 수행하여 결과 생성 합니다.


5. 기타힌트

  가) APPEND

    - INSERT시 DIRECT-PATH방식으로 수행 합니다. (병렬모드 수행)


  나) CACHE

    - 전체테이블 스캔 방식으로 읽힌 블록을 LRU리스트 최근 사용 위치에 머물도록 하는 힌트 입니다.

    - 크기가 작은 테이블에 유용합니다. 기본 캐쉬 정의는 무효화 됩니다.


  다)  CARDINALITY

    - 해당 쿼리 전체/일부 구성에 대한 카디널리티 예상값을 제공 실행계획 수립에 참조하는 힌트 입니다.

    - 테이블을 지정하지 않을 경우 카디널리티는 전체 쿼리를 수행한 결과 총 건수로 간주 합니다.


  라) PUSH_PRED

    - 뷰나 인라인뷰의 외부에 있는 조인 조건을 뷰 쿼리 내로 삽입하는 힌트 입니다.

    - 직접 조인을 한 것과 같은 실행계획을 생성 합니다.


  마) PUSH_SUBQ

    - MERGE되지 않은 서브쿼리를 최대한 먼저 수행되도록 실행계획을 수힙하는 힌트 입니다.

    - 수행된 서브쿼리는 제공자의 역할을 합니다.



정리한 인덱스 외에도 많은 힌트들이 있습니다.

힌트를 사용하는 이유는 옵티마이져의 잘못된 판단을 바로 잡아주는 방법입니다.

잘못 사용할 경우 쿼리가 지정될수 있습니다.


Posted by dlfma1985