개요
- PostgreSQL은 Oracle 과 같은 Hint를 제공하지 않는다.
- 사용자가 Oracle의 Hint 처럼 인덱스를 지정하거나, 조인순서 등을 지정할 수 있는 기능이 필요하다.
PG_HINT_PLAN 기능으로 Oracle의 hint를 대신한다.
특징
- Oracle의 Hint는 옵티마이저에게 특정한 액세스 방법과 타입을 지정하는 Directive가 된다.
옵티마이저는 부정확한 문법을 사용하거나 의미론적으로 부정확할 때 Hint를 무시할 수 있다.
- PostgreSQL의 PG_HINT_PLAN는 Plan Tree 자체를 변경하는 기법으로 Optimizer는 지정한
PG_HINT_PLAN를 무시할 수 없다.
예를 들어 t1라는 테이블에 t1_idx1, t1_idx2, t1_idx3 이라는 인덱스만 존재하고 idx_a05라는 힌트를 사용하라고
잘못 지정한 경우 oracle의 경우 힌트를 무시하고 Optimizer 실행계획을 다시 세우지만
PostgreSQL의 PG_HINT_PLAN의 경우 잘못 지정된 힌트로 인해 Seq Scan 이 발생한다.
그룹 | Format | 설명 |
스캔 방법 |
SeqScan(table) | 테이블을 순차적으로 스캔한다. |
TidScan(table) | 테이블에서 TID 스캔을 강제 실행한다. | |
IndexScan(table[ index...]) | 테이블에서 인덱스 스캔을 강제 실행한다. 지정된 Index 가있는 경우이를 제한한다. |
|
IndexOnlyScan(table[ index...]) | 강제로 인덱스 스캔한다. 특정 인덱스가 있으면 그 인덱 스를 지정하면된다. 인덱스 only scan 만 사용할 수없는 경우 인덱스 스캔을 사용할 수 있다. PostgreSQL 9.2 이 상에서 사용 가능. |
|
BitmapScan(table[ index...]) | 테이블에서 비트 맵 스캔을 강제 실행한다. 특정 Index 로 복원된다. |
|
NoSeqScan(table) | 테이블을 순차적으로 스캔하지 않도록 한다 | |
NoTidScan(table) | 테이블에서 TID 스캔을하지 않도록 한다. | |
NoIndexScan(table) | 테이블에서 인덱스 스캔 및 index only scan (PostgreSQL 9.2 이상용)을 수행하지 않도록한다. |
|
NoIndexOnlyScan(table) | Index를 수행하지 않도록 강제로 테이블에서만 검색한다. PostgreSQL 9.2 이상에서 사용가능. |
|
NoBitmapScan(table) | 테이블에서 비트 맵 스캔을 수행하지 않도록한다. | |
조인 방법 |
NestLoop(table table[ table...]) | |
HashJoin(table table[ table...]) | ||
MergeJoin(table table[ table...]) | ||
NoNestLoop(table table[ table...]) | ||
NoHashJoin(table table[ table...]) | ||
NoMergeJoin(table table[ table...]) | ||
조인 순서 |
Leading(table table[ table...]) |
PostgreSQL 에서 "offset 0"을 사용하면 Oracle 기준의 서브쿼리 NO_UNNEST 및 인라인뷰의 NO_MERGE 를 유도할 수 있다.