L
o
a
d
i
n
g
.
.
.

ホーム

お知らせ

製品・ソリューション

サービス

導入事例・パートナー

EXEM Academy・ブログ

会社情報

採用情報

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

PHP Code Snippets Powered By : XYZScripts.com