CREATE DIMENSION

目的

CREATE DIMENSION文を使用すると、ディメンションを作成できます。ディメンションは、列セットのペア間の親子関係を定義するもので、この列セットに含まれるすべての列は、同じ表の列である必要があります。ただし、1つの列集合(レベル)の列は、別の集合の列とは異なる表から得ることができます。オプティマイザは、マテリアライズド・ビューとの関係を使用してクエリー・リライトを行います。SQLアクセス・アドバイザは、この関係に基づいて、特定のマテリアライズド・ビューの作成を推奨します。

ノート:

Oracle Databaseは、ディメンションの作成中に宣言する関係の妥当性チェックを自動的には行いません。hierarchy_clauseおよびCREATE DIMENSIONdimension_join_clauseで指定する関係の妥当性チェックを行うには、DBMS_OLAP.VALIDATE_DIMENSIONプロシージャを実行する必要があります。

関連項目:

前提条件

自分のスキーマ内にディメンションを作成する場合は、CREATE DIMENSIONシステム権限が必要です。他のユーザーのスキーマ内にディメンションを作成する場合は、CREATE ANY DIMENSIONシステム権限が必要です。どちらの場合も、ディメンションで参照されるオブジェクトに対して、READまたはSELECTオブジェクト権限が必要です。

構文

create_dimension::=

hierarchy_clause::=

dimension_join_clause::=

attribute_clause::=

extended_attribute_clause::=

セマンティクス

schema

ディメンションを作成するスキーマを指定します。schemaを指定しない場合、自分のスキーマにそのディメンションが作成されます。

dimension

ディメンション名を指定します。名前は、「データベース・オブジェクトのネーミング規則」に指定されている要件を満たしている必要があります。

level_clause

level_clauseでは、ディメンションのレベルを指定します。レベルは、ディメンション階層および属性を定義します。

level

レベルの名前を指定します。

level_table . level_column

レベル内の列を指定します。最大32列を指定できます。この句で指定する表は、すでに存在している必要があります。

SKIP WHEN NULL

この句を指定すると、指定したレベルが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_levellevel_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_clauseCHILD OF関係からスキーマおよび表が判断されます。child_key_columnのスキーマおよび列を指定する場合は、hierarchy_clauseparent_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を使用して作成される属性の種類と同じです。唯一の違いは、属性にレベル名とは異なる名前を割り当てることができることです。

ディメンションの作成: 例

この文は、サンプル・スキーマshcustomers_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)
;