OPT ESTIMATE

目次

基本情報

 

ヒント

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ヒント