CREATE DIMENSION
目的
CREATE
DIMENSION
文を使用すると、ディメンションを作成できます。ディメンションは、列セットのペア間の親子関係を定義するもので、この列セットに含まれるすべての列は、同じ表の列である必要があります。ただし、1つの列集合(レベル)の列は、別の集合の列とは異なる表から得ることができます。オプティマイザは、マテリアライズド・ビューとの関係を使用してクエリー・リライトを行います。SQLアクセス・アドバイザは、この関係に基づいて、特定のマテリアライズド・ビューの作成を推奨します。
ノート:
Oracle Databaseは、ディメンションの作成中に宣言する関係の妥当性チェックを自動的には行いません。hierarchy_clause
およびCREATE
DIMENSION
のdimension_join_clause
で指定する関係の妥当性チェックを行うには、DBMS_OLAP
.VALIDATE_DIMENSION
プロシージャを実行する必要があります。
関連項目:
-
マテリアライズド・ビューの詳細は、「CREATE MATERIALIZED VIEW」を参照してください。
-
クエリー・リライト、オプティマイザおよびSQLアクセス・アドバイザの詳細は、『Oracle Database SQLチューニング・ガイド』を参照してください。
前提条件
自分のスキーマ内にディメンションを作成する場合は、CREATE
DIMENSION
システム権限が必要です。他のユーザーのスキーマ内にディメンションを作成する場合は、CREATE
ANY
DIMENSION
システム権限が必要です。どちらの場合も、ディメンションで参照されるオブジェクトに対して、READ
またはSELECT
オブジェクト権限が必要です。
構文
create_dimension::=
extended_attribute_clause::=
セマンティクス
schema
ディメンションを作成するスキーマを指定します。schema
を指定しない場合、自分のスキーマにそのディメンションが作成されます。
dimension
ディメンション名を指定します。名前は、「データベース・オブジェクトのネーミング規則」に指定されている要件を満たしている必要があります。
level_clause
level_clause
では、ディメンションのレベルを指定します。レベルは、ディメンション階層および属性を定義します。
level
レベルの名前を指定します。
level_table . level_column
レベル内の列を指定します。最大32列を指定できます。この句で指定する表は、すでに存在している必要があります。
この句を指定すると、指定したレベルがNULL
の場合、そのレベルはスキップされます。この句を使用すると、指定したレベルをスキップする代替パスによって、親子関係の階層のつながりを維持できます。「hierarchy_clause」を参照してください。
ディメンション・レベル列の制限事項
ディメンション・レベル列には、次の制限事項があります。
-
レベルの列は、すべて同じ表から得られたものである必要があります。
-
異なるレベルの列が異なる表から得られる場合、
dimension_join_clause
を指定する必要があります。 -
指定する列の集合は、このレベルに一意である必要があります。
-
指定する列は、他のディメンションでは指定できません。
-
レベルが
SKIP
WHEN
NULL
で指定されていないかぎり、各level_column
は、NULL以外である必要があります。NULL以外の列にNOT
NULL
制約を指定する必要はありません。SKIP
WHEN
NULL
を指定する列に、NOT
NULL
制約を指定することはできません。
hierarchy_clause
hierarchy_clause
では、ディメンションのレベルの線形階層を定義します。各階層が、ディメンションのレベル間で親子関係の連鎖を形成します。ディメンションの階層は、互いに依存していません。階層は、共通の列を持つことができます。
ディメンションの各レベルは、句の中で最高1回指定され、level_clause
で名前を付けておく必要があります。
hierarchy
階層名を指定します。この名前は、ディメンションで一意である必要があります。
child_level
親レベルとのn:1関係を持つレベルの名前を指定します。child_level
のlevel_columns
はNULL以外である必要があります。各child_level
値は、次の名前付きparent_level
の値を一意に定義します。
子level_table
が親level_table
と異なる場合、dimension_join_clause
でそれらの結合関係を指定する必要があります。
parent_level
レベル名を指定します。
dimension_join_clause
dimension_join_clause
を使用すると、複数の表に列が含まれるディメンションに内部等価結合関係を指定できます。この句は、階層で指定されたすべての列が同じ表にあるとはかぎらない場合にのみ指定する必要があり、このときのみ指定できます。
child_key_column
親レベルの列と結合互換性のある1つ以上の列を指定します。
スキーマおよび各child_column
の表を指定しない場合、hierarchy_clause
のCHILD
OF
関係からスキーマおよび表が判断されます。child_key_column
のスキーマおよび列を指定する場合は、hierarchy_clause
のparent_level
の子のスキーマおよび列の表と一致している必要があります。
parent_level
レベル名を指定します。
結合ディメンションの制限事項
結合ディメンションには、次の制限事項があります。
-
同じ階層の既存のレベルの組に対して、1つの
dimension_join_clause
のみを指定できます。 -
child_key_columns
はNULL以外であり、親キーが一意でNULL以外である必要があります。条件を適用するために制約を定義する必要はありません。ただし、条件を満たさない場合、問合せが不適切な結果を戻すことがあります。 -
各子キーは、
parent_level
表のキーと結合する必要があります。 -
自己結合は使用できません。
child_key_columns
を、parent_level
と同じ表に置くことはできません。 -
子キー列は、すべて同じ表から得られたものである必要があります。
-
子キー列数は、
parent_level
の列数と一致し、列は結合可能である必要があります。 -
親レベルが複数の列で構成されている場合のみ、子キー列を指定します。
attribute_clause
attribute_clause
を使用すると、階層レベルによって一意に定義されている列を指定できます。level
の列は、dependent_columns
と同じ表からすべて得る必要があります。dependent_columns
は、level_clause
で指定されている必要はありません。
たとえば、階層レベルが市
、都道府県名、
および国
の場合、市
は市長
、都道府県名
は知事
、国
は首相
を決定します。
extended_attribute_clause
この句を使用すると、1つ以上のレベルと列の関係に属性名を指定できます。この句で作成する属性の種類は、attribute_clause
を使用して作成される属性の種類と同じです。唯一の違いは、属性にレベル名とは異なる名前を割り当てることができることです。
例
ディメンションの作成: 例
この文は、サンプル・スキーマsh
にcustomers_dim
ディメンションを作成するために使用されました。
CREATE DIMENSION customers_dim LEVEL customer IS (customers.cust_id) LEVEL city IS (customers.cust_city) LEVEL state IS (customers.cust_state_province) LEVEL country IS (countries.country_id) LEVEL subregion IS (countries.country_subregion) LEVEL region IS (countries.country_region) HIERARCHY geog_rollup ( customer CHILD OF city CHILD OF state CHILD OF country CHILD OF subregion CHILD OF region JOIN KEY (customers.country_id) REFERENCES country ) ATTRIBUTE customer DETERMINES (cust_first_name, cust_last_name, cust_gender, cust_marital_status, cust_year_of_birth, cust_income_level, cust_credit_limit) ATTRIBUTE country DETERMINES (countries.country_name) ;
拡張属性を含むディメンションの作成: 例
または、次の例に示すように、attribute_clause
のかわりにextended_attribute_clause
を使用することもできます。
CREATE DIMENSION customers_dim LEVEL customer IS (customers.cust_id) LEVEL city IS (customers.cust_city) LEVEL state IS (customers.cust_state_province) LEVEL country IS (countries.country_id) LEVEL subregion IS (countries.country_subregion) LEVEL region IS (countries.country_region) HIERARCHY geog_rollup ( customer CHILD OF city CHILD OF state CHILD OF country CHILD OF subregion CHILD OF region JOIN KEY (customers.country_id) REFERENCES country ) ATTRIBUTE customer_info LEVEL customer DETERMINES (cust_first_name, cust_last_name, cust_gender, cust_marital_status, cust_year_of_birth, cust_income_level, cust_credit_limit) ATTRIBUTE country DETERMINES (countries.country_name);
NULL列値を含むディメンションの作成: 例
次の例では、レベル列のいずれかがNULLで、階層のつながりを保持する必要がある場合のディメンションの作成方法を示します。この例では、簡単に説明するためにcust_marital_status
列を使用しています。この列はNOT
NULL
列ではありません。この制約がある場合は、SKIP
WHEN
NULL
句を使用する前にこの制約を使用禁止にする必要があります。
CREATE DIMENSION customers_dim LEVEL customer IS (customers.cust_id) LEVEL status IS (customers.cust_marital_status) SKIP WHEN NULL LEVEL city IS (customers.cust_city) LEVEL state IS (customers.cust_state_province) LEVEL country IS (countries.country_id) LEVEL subregion IS (countries.country_subregion) SKIP WHEN NULL LEVEL region IS (countries.country_region) HIERARCHY geog_rollup ( customer CHILD OF city CHILD OF state CHILD OF country CHILD OF subregion CHILD OF region JOIN KEY (customers.country_id) REFERENCES country ) ATTRIBUTE customer DETERMINES (cust_first_name, cust_last_name, cust_gender, cust_marital_status, cust_year_of_birth, cust_income_level, cust_credit_limit) ATTRIBUTE country DETERMINES (countries.country_name) ;