31 DBMS_AW_STATS

DBMS_AW_STATSには、キューブおよびディメンションのオプティマイザ統計情報を管理するためのサブプログラムが含まれています。統計情報の生成には、大幅なパフォーマンス・コストはかかりません。

参照:

ビジネス・インテリジェンス・アプリケーションおよび分析アプリケーションをサポートするOLAPオプションの使用の詳細は、『Oracle OLAPユーザーズ・ガイド』を参照してください。

この章のトピックは、次のとおりです:

31.1 DBMS_AW_STATSの使用方法

キューブおよびディメンションは、複数ディメンションの分析をサポートする優れたデータ・オブジェクトです。キューブおよびディメンションは、アナリティック・ワークスペースと呼ばれるコンテナに格納されています。OLAPオプションを使用すると、Oracle Databaseで複数ディメンションのオブジェクトと分析を使用できます。

オプティマイザ統計情報は、2つのキューブ・ビューを結合する問合せ、またはキューブ・ビューを表または表のビューに結合する問合せの実行計画を作成するために使用されます。また、キューブ・マテリアライズド・ビューへのクエリー・リライトにも使用されます。オプティマイザ統計情報は、これらのタイプの問合せに対してのみ必要です。

単一のキューブに対する問合せでは、オプティマイザ統計情報を使用しません。これらの問合せは、アナリティック・ワークスペース内で自動的に最適化されます。

31.2 DBMS_AW_STATSサブプログラムの要約

DBMS_AW_STATSは、ANALYZEおよびCLEARプロシージャを使用します。

表31-1 DBMS_AW_STATSパッケージのサブプログラム

サブプログラム 説明

ANALYZEプロシージャ

キューブおよびキューブ・ディメンションに関するオプティマイザ統計情報を生成します。

CLEARプロシージャ

キューブおよびキューブ・ディメンションに関するオプティマイザ統計情報を消去します。

31.2.1 ANALYZEプロシージャ

このプロシージャは、キューブまたはキューブ・ディメンションに関するオプティマイザ統計情報を生成します。

これらの統計情報を使用した実行計画の生成については、「DBMS_AW_STATSの使用方法」を参照してください。

キューブの場合、統計情報は、すべてのメジャーおよびキューブに関連付けられた計算済のメジャーに対して収集されます。統計情報には次のものが含まれています。

  • データ値の平均長

  • 最大データ値の長さ

  • 最小値

  • 個別値の数

  • NULL値の数

ディメンションの場合、統計情報は、ディメンションとその属性、レベルおよび階層に対して収集されます。統計情報には次のものが含まれています。

  • 値の平均長

  • 最大値の長さ

  • 最小値

  • 最大値

構文

DBMS_AW_STATS.ANALYZE
     (inname       IN VARCHAR2);

パラメータ

表31-2 ANALYZEプロシージャのパラメータ

パラメータ 説明

inname

キューブまたはディメンションの修飾名。

キューブの場合、修飾名の形式は、owner.cube_nameです。

ディメンションの場合、修飾名の形式は、owner.dimension_nameです。

使用上の注意

常に、最初にディメンションを分析してから、キューブを分析してください。

ディメンションの分析後、そのディメンションを使用するすべてのキューブを分析します。

このサンプル・スクリプトは、UNITS_CUBEおよびそのディメンションに関するオプティマイザ統計情報を生成します。

BEGIN
     DBMS_AW_STATS.ANALYZE('time');
     DBMS_AW_STATS.ANALYZE('customer');
     DBMS_AW_STATS.ANALYZE('product');
     DBMS_AW_STATS.ANALYZE('channel');
     DBMS_AW_STATS.ANALYZE('units_cube');
END;
/

次の例では、UNITS_CUBE_VIEWCUSTOMER_PRIMARY_VIEWおよびACCOUNTS表の列を結合するSELECT文の実行計画を作成して表示しています。

EXPLAIN PLAN FOR SELECT 
     cu.long_description customer,
     a.city city,
     a.zip_pc zip,
     cu.level_name "LEVEL",
     round(f.sales) sales
/* From dimension views and cube view */
FROM time_calendar_view t,
     product_primary_view p,
     customer_view cu,
     channel_view ch,
     units_cube_view f,
     account a
/* Create level filters instead of GROUP BY */
WHERE t.long_description = '2004'
    AND p.level_name ='TOTAL'
    AND cu.customer_account_id like 'COMP%'
    AND ch.level_name = 'TOTAL'
/* Join dimension views to cube view */
    AND t.dim_key = f.TIME
    AND p.dim_key = f.product
    AND cu.dim_key = f.customer
    AND ch.dim_key = f.channel
    AND a.account_id = cu.customer_account_id
ORDER BY zip;
SQL>  SELECT plan_table_output FROM TABLE(dbms_xplan.display());
 
PLAN_TABLE_OUTPUT
-------------------------------------------------------------------------------------------------
Plan hash value: 3890178023
 
-----------------------------------------------------------------------------------------------
| Id  | Operation                        | Name       | Rows  | Bytes | Cost (%CPU)| Time     |
-----------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT                 |            |     1 |    89 |     6  (34)| 00:00:01 |
|   1 |  SORT ORDER BY                   |            |     1 |    89 |     6  (34)| 00:00:01 |
|*  2 |   HASH JOIN                      |            |     1 |    89 |     5  (20)| 00:00:01 |
|   3 |    JOINED CUBE SCAN PARTIAL OUTER|            |       |       |            |          |
|   4 |     CUBE ACCESS                  | UNITS_CUBE |       |       |            |          |
|   5 |     CUBE ACCESS                  | CHANNEL    |       |       |            |          |
|   6 |     CUBE ACCESS                  | CUSTOMER   |       |       |            |          |
|   7 |     CUBE ACCESS                  | PRODUCT    |       |       |            |          |
|*  8 |     CUBE ACCESS                  | TIME       |     1 |    55 |     2   (0)| 00:00:01 |
|*  9 |    TABLE ACCESS FULL             | ACCOUNT    |     3 |   102 |     2   (0)| 00:00:01 |
-----------------------------------------------------------------------------------------------
 
Predicate Information (identified by operation id):
---------------------------------------------------
 
   2 - access("A"."ACCOUNT_ID"=SYS_OP_ATG(VALUE(KOKBF$),39,40,2))
   8 - filter(SYS_OP_ATG(VALUE(KOKBF$),16,17,2)='2004' AND
              SYS_OP_ATG(VALUE(KOKBF$),39,40,2) LIKE 'COMP%' AND
              SYS_OP_ATG(VALUE(KOKBF$),47,48,2)='TOTAL' AND
              SYS_OP_ATG(VALUE(KOKBF$),25,26,2)='TOTAL')
   9 - filter("A"."ACCOUNT_ID" LIKE 'COMP%')
 
Note
-----
   - dynamic statistics used for this statement
 
30 rows selected.

31.2.2 CLEARプロシージャ

このプロシージャは、ANALYZEプロシージャによって生成された統計情報を消去します。

構文

DBMS_AW_STATS.CLEAR (
          inname        IN  VARCHAR2;

パラメータ

表31-3 CLEARプロシージャのパラメータ

パラメータ 説明

inname

キューブまたはディメンションの修飾名。

キューブの場合、修飾名の形式は、owner.cube_nameです。

ディメンションの場合、修飾名の形式は、owner.dimension_nameです。

次のスクリプトは、UNITS_CUBEおよびそのディメンションの統計情報を消去します。

BEGIN
     DBMS_AW_STATS.clear('units_cube');
     DBMS_AW_STATS.clear('time');
     DBMS_AW_STATS.clear('customer');
     DBMS_AW_STATS.clear('product');
     DBMS_AW_STATS.clear('channel');
END;
/