CARDINALITY

目次

基本情報

 

ヒント

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