DBMS_AW_STATSには、キューブおよびディメンションのオプティマイザ統計情報を管理するためのサブプログラムが含まれています。統計情報の生成には、大幅なパフォーマンス・コストはかかりません。
|
関連項目: ビジネス・インテリジェンス・アプリケーションおよび分析アプリケーションをサポートするOLAPオプションの使用の詳細は、『Oracle OLAPユーザーズ・ガイド』を参照してください。 |
この章では、次の項目について説明します。
キューブおよびディメンションは、複数ディメンションの分析をサポートする優れたデータ・オブジェクトです。キューブおよびディメンションは、アナリティック・ワークスペースと呼ばれるコンテナに格納されています。OLAPオプションを使用すると、Oracle Databaseで複数ディメンションのオブジェクトと分析を使用できます。
オプティマイザ統計情報は、2つのキューブ・ビューを結合する問合せ、またはキューブ・ビューを表または表のビューに結合する問合せの実行計画を作成するために使用されます。また、キューブ・マテリアライズド・ビューへのクエリー・リライトにも使用されます。オプティマイザ統計情報は、これらのタイプの問合せに対してのみ必要です。
単一のキューブに対する問合せでは、オプティマイザ統計情報を使用しません。これらの問合せは、アナリティック・ワークスペース内で自動的に最適化されます。
表33-1 DBMS_AW_STATSパッケージのサブプログラム
| サブプログラム | 説明 |
|---|---|
|
|
キューブおよびキューブ・ディメンションに関するオプティマイザ統計情報を生成します。 |
|
|
キューブおよびキューブ・ディメンションに関するオプティマイザ統計情報を消去します。 |
このプロシージャは、キューブまたはキューブ・ディメンションに関するオプティマイザ統計情報を生成します。これらの統計情報を使用した実行計画の生成については、「DBMS_AW_STATSの使用方法」を参照してください。
キューブの場合、統計情報は、すべてのメジャーおよびキューブに関連付けられた計算済のメジャーに対して収集されます。統計情報には次のものが含まれています。
データ値の平均長
最大データ値の長さ
最小値
個別値の数
NULL値の数
ディメンションの場合、統計情報は、ディメンションとその属性、レベルおよび階層に対して収集されます。統計情報には次のものが含まれています。
値の平均長
最大値の長さ
最小値
最大値
例
このサンプル・スクリプトは、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_VIEW、CUSTOMER_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.