2018.08.13
CARDINALITY
目次
- 1. 基本情報
- 2. 使用例
- 3. 関連情報
基本情報
ヒント
CARDINALITY
Syntax
/*+ CARDINALITY(query_block_name n) */
サポート
9i ~
詳細
特定のQuery BlockのCardinalityを強制指定します. Cardinalityを指定することで Oracleが指定されたCardinalityに設定した実行計画を樹立する目的に使用されます。
このHintの利点は、CBOの特性を利用するものです。一般的にINDEX、FULLなどのHintを実行計画自体を固定させてしまう一方で、CARDINALITY Hintは予測ローを数万を付与し、残りはOptimizerに一任します。したがってCBOの動作に応じて、より柔軟な実行計画が可能となります。
使用例
例
次の例を見てみましょう。
KJA@ukja10> select count(*) from t_px1; COUNT(*) ---------- 500000 Elapsed: 00:00:03.17 UKJA@ukja10> select count(*) from t_px1 where c2 like '%name%'; COUNT(*) ---------- 500000 Elapsed: 00:00:03.35
t_px1テーブルのロー件数は500,000件であり、c2 like’%name%」の条件を満たしているロー件数も同じ500,000件です。
UKJA@ukja10> explain plan for 2 select * from t_px1 where c2 like '%name%'; Explained. Elapsed: 00:00:00.01 UKJA@ukja10> select * from table(dbms_xplan.display); PLAN_TABLE_OUTPUT -------------------------------------------------------------------------------- Plan hash value: 3915865122 --------------------------------------------------------------------------- | Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time | --------------------------------------------------------------------------- | 0 | SELECT STATEMENT | | 25072 | 220K| 241 (3)| 00:00:03 | |* 1 | TABLE ACCESS FULL| T_PX1 | 25072 | 220K| 241 (3)| 00:00:03 | --------------------------------------------------------------------------- Predicate Information (identified by operation id): --------------------------------------------------- 1 - filter("C2" LIKE '%test%') 13 rows selected.
しかし、予測ロー件数は25,000件程度、実際のロー件数の5%に過ぎません。OracleのOptimizerは、LIKE’%’検索に対して適切な解釈をすることができないため、常に5%の値と予測します。上記の例の場合、非常に不正確な結果を生むことが分かります。
UKJA@ukja10> explain plan for 2 select /*+ cardinality(t_px1 500000) */ * 3 from t_px1 where c1 like '%test%'; Explained. Elapsed: 00:00:00.00 UKJA@ukja10> @plan PLAN_TABLE_OUTPUT -------------------------------------------------------------------------------- Plan hash value: 3915865122 --------------------------------------------------------------------------- | Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time | --------------------------------------------------------------------------- | 0 | SELECT STATEMENT | | 500K| 4394K| 243 (4)| 00:00:03 | |* 1 | TABLE ACCESS FULL| T_PX1 | 500K| 4394K| 243 (4)| 00:00:03 | --------------------------------------------------------------------------- Predicate Information (identified by operation id): --------------------------------------------------- 1 - filter(TO_CHAR("C1") LIKE '%test%') 13 rows selected.
しかし、CARDINALITY Hintを付与すると予測ロー数を私たちが望むの値を変えることができます。このようにすると、Oracleは、正確なロー数に基づいて実行計画を策定することができます。
関連情報
1. OPT_ESTIMATEヒント