Admin

Postgresql PG_HINT_PLAN

Qhtlr 2020. 9. 1. 09:53

개요
- 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 를 유도할 수 있다.