힌트란 SQL 문장에 대한 지시 구문입니다.

Optimizer 힌트는 실행 계획을 변경할 수 있고 최적의 실행 계획을 사용하도록 하는 데 사용됩니다

옵티마이저가 알지 못하는 데이터에 대한 정보를 알고 있는 경우 특정 쿼리 실행 계획을 선택하도록 지시할 수 있습니다.

 

단, Optimizer에 대해 개념을 정확히 알고 사용해야 하며, 데이터의 변동성 등을 충분히 예측하여 사용해야 합니다.

힌트의 사용은 단기적으로 성능향상이 있을 수 있으나, 장기적으로 성능 저하를 초래할 수 있기 때문에 최대한 사용을 자제하며 정확히 알고 있는 경우에만 사용하도록 합니다..

 

뷰와 함께 힌트 사용하기

Oracle은 뷰(또는 하위 쿼리) 내부나에서 힌트 사용을 권장하지 않습니다. 또한 이러한 힌트로 인해 예기치 않은 실행 계획이 발생할 수 있습니다. 특히 뷰 내부 또는 뷰에 대한 힌트는 뷰가 최상위 쿼리에 병합 가능한지 여부에 따라 다르게 처리됩니다.

 

힌트 사용 방법

명령문 블록에는 힌트가 포함된 주석이 하나만 있을 수 있으며,

주석은 SELECT, UPDATE, INSERT, MERGE 또는 DELETE 키워드 뒤에 와야 합니다.

 

힌트 종류

1. Types of Hints

  • Single-table : 단일 테이블 힌트는 하나의 테이블 또는 뷰에 지정됩니다. INDEX 및 USE_NL은 단일 테이블 힌트의 예입니다.
  • Multi-table :다중 테이블 힌트는 힌트가 하나 이상의 테이블이나 뷰를 지정할 수 있다는 점을 제외하면 단일 테이블 힌트와 비슷합니다. LEADING은 다중 테이블 힌트의 예입니다. USE_NL(table1 table2)은 USE_NL(table1) 및 USE_NL(table2)의 형태와 동일하므로 다중 테이블 힌트로 간주되지 않습니다.
  • Query block : 쿼리 블록 힌트는 단일 쿼리 블록에서 작동합니다. STAR_TRANSFORMATION 및 UNNEST는 쿼리 블록 힌트의 예입니다.
  • Statement : 구문 힌트는 전체 SQL 문에 적용됩니다. ALL_ROWS는 구문 힌트의 예입니다.

SQL Plan Baselines. ???

 

2. Hints by Category

Optimizer 힌트는 다음 범주로 그룹화됩니다.

 

2.1 Hints for Optimization Approaches and Goals

ALL_ROWS 및 FIRST_ROWS(n) 힌트를 사용하면 최적화 접근 방식과 목표 중에서 선택할 수 있습니다. SQL 문에 최적화 접근 방식과 목표를 지정하는 힌트가 있는 경우 옵티마이저는 통계 유무, OPTIMIZER_MODE 초기화 매개변수 값, ALTER SESSION 문의 OPTIMIZER_MODE 매개변수에 관계없이 지정된 접근 방식을 사용합니다.

 

2.2 Hints for Enabling Optimizer Features

OPTIMIZER_FEATURES_ENABLE 힌트는 Oracle Database 릴리스 번호를 기반으로 최적화 기능을 활성화하기 위한 역할을 합니다. 이 힌트는 데이터베이스 업그레이드 후 계획 회귀를 확인할 때 유용한 방법입니다.
힌트에 대한 인수로 릴리스 번호를 지정합니다. 다음 예는 Oracle Database 11g Release 1(11.1.0.6)의 옵티마이저 기능으로 쿼리를 실행합니다.

SELECT /*+ optimizer_features_enable('11.1.0.6') */ employee_id, last_name
FROM    employees
ORDER BY employee_id;

 

2.3 Hints for Access Paths

다음 힌트는 테이블에 대한 특정 액세스 경로를 사용하도록 지시합니다.

 

2.3.1 FULL Hint

FULL 힌트는 옵티마이저가 지정된 테이블에 대해 전체 테이블 스캔을 수행하도록 지시합니다.

SELECT /*+ FULL(e) */ employee_id, last_name
  FROM hr.employees e 
  WHERE last_name LIKE :b1;

Oracle Database는 WHERE 절의 조건에 의해 사용 가능한 last_name 열에 인덱스가 있는 경우에도 직원 테이블에 대해 전체 테이블 스캔을 수행하여 이 문을 실행합니다.
직원 테이블의 FROM 절에 별칭 e가 있으므로 힌트는 이름이 아닌 별칭으로 테이블을 참조해야 합니다.

 

2.3.2 CLUSTER Hint

CLUSTER 힌트는 지정된 테이블에 액세스하기 위해 클러스터 스캔을 명시적으로 선택합니다. 클러스터링된 개체에만 적용됩니다.

SELECT /*+ CLUSTER(e) */ employee_id, last_name
  FROM hr.employees e 
  WHERE last_name LIKE :b1;

 

2.3.3 HASH Hint

HASH 힌트는 명시적으로 해시 스캔을 선택하여 지정된 테이블에 액세스합니다. 클러스터에 저장된 테이블에만 적용됩니다.

SELECT /*+ HASH(e) */ employee_id, last_name
  FROM hr.employees e 
  WHERE last_name LIKE :b1;

 

Cluster Table

 

2.3.4 INDEX and NO_INDEX Hint

INDEX hint

INDEX 힌트는 지정된 테이블에 대한 인덱스 스캔을 선택합니다. 도메인, B-트리, 비트맵 및 비트맵 조인 인덱스에 대해 INDEX 힌트를 사용할 수 있습니다. 그러나 Oracle은 여러 인덱스 조합에 INDEX보다 INDEX_COMBINE을 사용할 것을 권장합니다. 

SELECT /*+ INDEX (employees emp_department_ix)*/ 
       employee_id, department_id 
  FROM employees 
  WHERE department_id > 50;

NO_INDEX hint

NO_INDEX 힌트는 지정된 테이블에 대한 인덱스 집합을 허용하지 않습니다.  

SELECT /*+ NO_INDEX(employees emp_empid) */ employee_id 
  FROM employees 
  WHERE employee_id > 200; 

 

 

 

 

2.4 Hints for Join Orders

 

2.5 Hints for Join Operations

다음 힌트는 테이블에 대한 특정 조인 작업을 사용하도록 지시합니다.

 

2.6 Hints for Online Application Upgrade

온라인 애플리케이션 업그레이드 힌트는 에디션 기반 재정의를 사용하여 온라인 애플리케이션 업그레이드를 수행할 때 충돌하는 INSERT 및 UPDATE 작업을 처리하는 방법을 제안합니다.

 

2.7 Hints for Parallel Execution

병렬 실행 힌트는 작업을 병렬화할지 여부와 방법에 대해 지시합니다. 다음 병렬 힌트를 사용할 수 있습니다.

 

2.8 Hints for Query Transformations

다음 힌트는 옵티마이저가 특정 SQL 쿼리 변환을 사용하도록 지시합니다.

 

2.9 Additional Hints

다음은추가 힌트입니다.

 

'ORACLE' 카테고리의 다른 글

Oracle HR ERD  (0) 2022.02.03
DBMS_XPLAN 패키지 실행 권한  (0) 2022.02.01
Oracle - 실행계획 보는 방법  (0) 2022.01.31
오라클 bind 변수 길이에 따른 bind mismatch  (0) 2022.01.02
Parent Cursors and Child Cursors  (0) 2022.01.01

+ Recent posts