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を指定する必要があります。 -
指定する列の集合は、このレベルに一意である必要があります。
-
指定する列は、他のディメンションでは指定できません。
-
レベルが
SKIPWHENNULLで指定されていないかぎり、各level_columnは、NULL以外である必要があります。NULL以外の列にNOTNULL制約を指定する必要はありません。SKIPWHENNULLを指定する列に、NOTNULL制約を指定することはできません。
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)
;




