OPT ESTIMATE
EXEM Knowledge Base
목차 |
[편집] 기본 정보
[편집] Hint 명
OPT_ESTIMATE
[편집] Syntax
/*+ OPT_ESTIMATE(query_block_name, operation[, ...], options) */
[편집] 지원
10g~
[편집] 상세 설명
OPT_ESTIMATE 힌트는 Oracle 10g의 SQL Tuning Advisor에 의해 사용된다. SQL Tuning Advisor는 기존 쿼리에 OPT_ESTIMATE 힌트를 적용함으로써 원하는 실행 계획을 수립한다. OPT_ESTIMATE 힌트는 CARDINALITY 힌트에 비해 훨씬 다양한 기능을 제공한다. 따라서 기존에 사용하던 CARDINALITY를 대신해서 사용할 수 있다. 자세한 내용은 아래 예제를 참조한다.
한가지 주의할 것은 OPT_ESTIMATE 힌트와 CARDINALITY 힌트 모두 Undocumented Hint, 즉 Oracle이 공식적으로 지원하지 않는 힌트라는 것이다. 즉 아무런 예고없이 없어지거나 사용법이 바뀔 수 있다.
[편집] 사용 예제
explain plan for select * from t1 where c1 = :b1 ; -------------------------------------------------------------------------- | Id | Operation | Name | Rows | Bytes | Cost (%CPU)| -------------------------------------------------------------------------- | 0 | SELECT STATEMENT | | 1 | 5 | 2 (0)| | 1 | TABLE ACCESS BY INDEX ROWID| T1 | 1 | 5 | 2 (0)| |* 2 | INDEX RANGE SCAN | T1_N1 | 1 | | 1 (0)| -------------------------------------------------------------------------- -- 예측 로우수를 1000배로 확대 explain plan for select /*+ opt_estimate(table, t1, scale_rows=1000) */ * from t1 where c1 = :b1 ; -------------------------------------------------------------------------- | Id | Operation | Name | Rows | Bytes | Cost (%CPU)| -------------------------------------------------------------------------- | 0 | SELECT STATEMENT | | 1000 | 5000 | 2 (0)| | 1 | TABLE ACCESS BY INDEX ROWID| T1 | 1000 | 5000 | 2 (0)| |* 2 | INDEX RANGE SCAN | T1_N1 | 1 | | 1 (0)| -------------------------------------------------------------------------- explain plan for select * from t2, (select * from t1) v where t2.c1 = v.c1 and t2.c2 = :b2 and v.c1 = :b1 ; ---------------------------------------------------------------------------- | Id | Operation | Name | Rows | Bytes | Cost (%CPU)| ---------------------------------------------------------------------------- | 0 | SELECT STATEMENT | | 1 | 11 | 3 (0)| | 1 | TABLE ACCESS BY INDEX ROWID | T1 | 1 | 5 | 1 (0)| | 2 | NESTED LOOPS | | 1 | 11 | 3 (0)| |* 3 | TABLE ACCESS BY INDEX ROWID| T2 | 1 | 6 | 2 (0)| |* 4 | INDEX RANGE SCAN | T2_N1 | 1 | | 1 (0)| |* 5 | INDEX RANGE SCAN | T1_N1 | 1 | | 0 (0)| ---------------------------------------------------------------------------- -- 조인 결과 수를 1000배로 확대 explain plan for select /*+ opt_estimate(join, (t2, v), scale_rows=100000) */ * from t2, (select /*+ no_merge */ * from t1) v where t2.c1 = v.c1 and t2.c2 = :b2 and v.c1 = :b1 ; ----------------------------------------------------------------------------- | Id | Operation | Name | Rows | Bytes | Cost (%CPU)| ----------------------------------------------------------------------------- | 0 | SELECT STATEMENT | | 1000 | 32000 | 4 (0)| |* 1 | TABLE ACCESS BY INDEX ROWID | T2 | 1 | 6 | 2 (0)| | 2 | NESTED LOOPS | | 1000 | 32000 | 4 (0)| | 3 | VIEW | | 1 | 26 | 2 (0)| | 4 | TABLE ACCESS BY INDEX ROWID| T1 | 1 | 5 | 2 (0)| |* 5 | INDEX RANGE SCAN | T1_N1 | 1 | | 1 (0)| |* 6 | INDEX RANGE SCAN | T2_N1 | 1 | | 1 (0)| -----------------------------------------------------------------------------
[편집] 관련 정보
- CARDINALITY 힌트