
OPT ESTIMATE - 日本エクセム株式会社 Oracle 技術情報
基本情報
ヒント名
OPT_ESTIMATE
Syntax
/*+ OPT_ESTIMATE(query_block_name, operation[, …], options) */
サポート
10g ~
詳細
OPT_ESTIMATEヒントはOracle10gの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)|
-----------------------------------------------------------------------------
関連情報
1. CARDINALITYヒント