CREATE MATERIALIZED ZONEMAP

目的

CREATE MATERIALIZED ZONEMAP文を使用して、ゾーン・マップを作成します。

ゾーンマップは、ゾーンの情報を格納する特別なタイプのマテリアライズド・ビューです。ゾーンは、1つ以上の表の列の値を格納するディスク上の一連の連続したデータ・ブロックです。通常、複数のゾーンが表の列のすべての値を格納するために必要です。ゾーン・マップは、各ゾーンに格納された最小および最大の表の列値を追跡します。

ゾーン・マップによって、表スキャンのI/OおよびCPUコストを削減できます。SQL文にゾーン・マップの列の述語が含まれる場合、データベースは述語の値と各ゾーンに格納されている最小および最大の表の列値を比較して、SQL実行中に読み込まれるゾーンを判断します。

Oracle Databaseでは次の種類のゾーン・マップがサポートされます。

  • 基本的なゾーンマップは単一の表に定義され、表の指定された列のゾーン情報を保持します。

    create_zonemap_on_table句を指定するか、定義する副問合せのFROM句で単一の表を指定するcreate_zonemap_as_subquery句を指定して、基本的なゾーン・マップを作成できます。

  • 結合ゾーンマップは2つ以上の結合した表に定義され、結合した表の指定された列のゾーン情報を保持します。

    create_zonemap_as_subquery句を指定して、結合ゾーン・マップを作成できます。定義する副問合せのFROM句では、1つ以上の他の表と左側外部結合されている表を指定する必要があります。

ゾーン・マップは、データ・ウェアハウス環境のスター・スキーマで一般的に使用されます。ただし、ゾーン・マップの作成にはスター・スキーマは必須ではありません。どちらの場合も、このマニュアルでは、スター・スキーマという用語を使用してゾーン・マップの表を参照します。結合ゾーン・マップでは、結合の外部表は、ファクトと呼ばれ、この表を結合する表をディメンションと呼びます。これらの表をあわせて、ゾーン・マップと呼びます。基本的なゾーン・マップでは、ゾーン・マップが定義される単一の表は、ゾーン・マップのファクト表および実表と呼ばれます。

ゾーン・マップの実表をパーティション表またはコンポジット・パーティション表にすることができます。この場合、ゾーン・マップは、各パーティション(およびサブパーティション)と各ゾーンの最小および最大の列値を保持します。

属性クラスタリングの使用に関係なくゾーン・マップを作成できます。

  • 属性クラスタリングで使用するゾーン・マップを作成するには、次の方法のいずれかを使用します。

    • CREATE MATERIALIZED ZONEMAP文を使用し、ゾーン・マップの属性クラスタ列を含めます。詳細は、CREATE TABLEattribute_clustering_clauseおよびALTER TABLEattribute_clustering_clause句を参照してください。

    • 属性クラスタ表の作成時または変更時にWITH MATERIALIZED ZONEMAP句を指定します。詳細は、CREATE TABLEzonemap_clauseおよびALTER TABLEMODIFY CLUSTERING句を参照してください。

  • 属性クラスタリングを使用しないゾーン・マップを作成するには、CREATE MATERIALIZED ZONEMAP文を使用し、ゾーン・マップにクラスタリングされている属性がない列を含めます。

関連項目:

ゾーン・マップの詳細は、『Oracle Databaseデータ・ウェアハウス・ガイド』を参照してください。

前提条件

自分のスキーマへのゾーン・マップの作成

  • CREATE MATERIALIZED VIEWシステム権限と、CREATE TABLEまたはCREATE ANY TABLEのいずれかのシステム権限が必要です。

  • 所有していないゾーン・マップの実表にアクセスする場合は、各表に対するREADまたはSELECTオブジェクト権限またはREAD ANY TABLEまたはSELECT ANY TABLEシステム権限が必要です。

別のユーザーのスキーマへのゾーン・マップの作成

  • CREATE ANY MATERIALIZED VIEWシステム権限が必要です。

  • ゾーン・マップの所有者には、CREATE TABLEシステム権限が必要です。スキーマ所有者が所有していないゾーン・マップの実表にアクセスする場合は、各表に対するREADまたはSELECTオブジェクト権限またはREAD ANY TABLEまたはSELECT ANY TABLEシステム権限が所有者に必要です。

REFRESH ON COMMITモードのゾーン・マップを作成する場合(REFRESH ON COMMIT句を使用する場合)は、前述の権限の他に、所有していない実表に対するON COMMIT REFRESHオブジェクト権限、またはON COMMIT REFRESHシステム権限が必要です。マテリアライズド・ビューと異なり、実表のマテリアライズド・ビュー・ログがなくても、REFRESH ON COMMITモードのゾーン・マップを作成できます。

ゾーン・マップを作成する場合、ゾーン・マップのすべてのスキーマに1つの内部表および少なくとも1つの索引が作成されます。これらのオブジェクトは、ゾーン・マップのデータをメンテナンスするために使用されます。これらのオブジェクトの作成に必要な権限を持つか、これらのオブジェクトを格納するターゲット表領域への十分な割当て制限があるか、UNLIMITED TABLESPACEシステム権限を持つ必要があります。

構文

create_materialized_zonemap::=

create_zonemap_on_table::=

create_zonemap_as_subquery::=

zonemap_attributes::=

zonemap_refresh_clause::=

ノート:

zonemap_refresh_clauseを指定する場合、REFRESHキーワードの後に少なくとも1つの句を指定する必要があります。

セマンティクス

create_zonemap_on_table

この句を使用して、基本的なゾーン・マップを作成します。

ON句

ON句には、まずゾーン・マップのファクト表を指定し、次にゾーン・マップに含めるファクト表の1つ以上の列をカッコ内に指定します。

指定されたファクト表のごとに、ゾーン・マップの2つの列が作成されます。これらの2つの列には、各ゾーンのファクト表の列の最小および最大の値が含まれます。最初に指定したファクト表columnに対してMIN_1_columnおよびMAX_1_column、2番目に指定したファクト表columnに対してMIN_2_columnおよびMAX_2_columnといった形式でゾーン・マップ列の名前が生成されます。

schemaを指定しない場合、自分のスキーマ内にファクト表があるとみなされます。ファクト表には表またはマテリアライズド・ビューを指定できます。

create_zonemap_as_subquery

この句を使用して、基本的なゾーン・マップまたは結合ゾーン・マップを作成します。基本的なゾーン・マップを作成するには、定義する副問合せのFROM句の単一の実表を指定します。結合ゾーン・マップを作成するには、定義する副問合せのFROM句の1つ以上の他の表に左側外部結合される表を指定します。

column_alias

ゾーン・マップに含める表の列ごとに列の別名を指定できます。列の別名のリストによって、競合する列名が明示的に解決されます。したがって、定義する副問合せのSELECTリストで別名を指定する必要がなくなります。この句で列の別名を指定する場合は、定義する副問合せのSELECTリストで各列の別名を指定する必要があります。指定する最初の列の別名は、SELECTリストの最初の列のSYS_OP_ZONE_IDファンクション式に対応するZONE_ID$である必要があります。

AS query_block

ゾーン・マップの定義副問合せを指定します。副問合せは、単一のquery_blockで構成する必要があります。query_blockSELECTFROMWHEREおよびGROUP BY句のみ指定できます。それらの句は次の要件を満たす必要があります。

  • SELECTリストの最初の列は、SYS_OP_ZONE_IDファンクション式である必要があります。詳細は、SYS_OP_ZONE_IDを参照してください。

  • SELECTリストの残りの列は、ゾーン・マップに含める列の最小および最大の値を戻すファンクション式である必要があります。列ごとに、次の形式のファンクション式の組を指定します。

    MIN([table.]column), MAX([table.]column)
    

    tableには、列を含む表の名前または表の別名を指定します。表にはファクト表またはディメンション表を指定できます。columnには、列の名前または列の別名を指定します。

  • FROM句にはファクト表のみ、またはファクト表とそれぞれがファクト表に左側外部結合されている1つ以上のディメンション表を指定できます。FROM句にLEFT [OUTER] JOIN構文を指定したり、外部結合演算子(+)をWHERE句の結合条件のディメンション表の列に適用できます。表の別名をFROM句の任意の表にオプションで指定できます。ファクト表およびディメンション表に表またはマテリアライズド・ビューを指定できます。

  • WHERE句には、外部結合演算子(+)を使用した左側外部結合条件のみ指定できます。

  • SELECTリストの最初の列に指定したSYS_OP_ZONE_IDファンクション式を使用して、GROUP BY句を指定する必要があります。

schema

ゾーン・マップを含むスキーマを指定します。schemaを指定しない場合、自分のスキーマにそのゾーン・マップが作成されます。

zonemap_name

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

zonemap_attributes

この句を使用してゾーン・マップの次の属性を指定します: TABLESPACESCALEPCTFREEPCTUSEDおよびCACHEまたはNOCACHE

TABLESPACE

ゾーン・マップを作成するtablespaceを指定します。この句を省略すると、ゾーン・マップを含むスキーマのデフォルト表領域にゾーン・マップが作成されます。

SCALE

この句を使用すると、ゾーンを形成する連続したディスク・ブロックの数を判断するゾーン・マップ・スケールを指定できます。このスケールは、2の累乗を表す整数値です。たとえば、10のスケールの場合、2の10乗(1024)まで連続したディスク・ブロックがゾーンを形成することを意味します。integerの場合、4から16の値(それらの値を含む)を指定します。推奨値は10です。この値はデフォルトです。

PCTFREE

ゾーン・マップの各データ・ブロック内で、ゾーン・マップの行を将来更新するために確保しておく領域の割合を表すintegerを指定します。整数値の範囲は0から99の値(それらの値を含む)です。デフォルト値は10です。PCTFREEパラメータの詳細は、physical_attributes_clauseを参照してください。

PCTUSED

使用済領域のうち、ゾーン・マップのデータ・ブロックごとに確保される最小限の割合を表すintegerを指定します。整数値の範囲は0から99の値(それらの値を含む)です。デフォルト値は40です。PCTUSEDパラメータの詳細は、physical_attributes_clauseを参照してください。

CACHE | NOCACHE

頻繁にアクセスするデータの場合、CACHEを指定すると、全表スキャンの実行時、このゾーン・マップに対して取り出されたは、バッファ・キャッシュで最低使用頻度(LRU)リストの最高使用頻度側に配置されます。

NOCACHEは、ブロックをLRUリストの最低使用頻度側に入れることを指定します。デフォルトはNOCACHEです。

zonemap_refresh_clause

この句を使用して、ゾーン・マップのデフォルトのリフレッシュ方法およびモードを指定します。リフレッシュ方法(FASTCOMPLETEまたはFORCE)を指定しないと、デフォルトの方法でFORCEが指定されます。リフレッシュ・モード(ON句)を指定しない場合、ON LOAD DATA MOVEMENTがデフォルト・モードです。

FAST

FASTを指定すると、高速リフレッシュ方法が使用されます。この方法では、実表に対して発生した変更に従ってリフレッシュを実行します。ゾーン・マップがマテリアライズド・ビューのタイプとして内部的に実装される場合、実表のマテリアライズド・ビュー・ログはゾーン・マップの高速リフレッシュを実行するために必要ではありません。

COMPLETE

COMPLETEを指定すると、完全リフレッシュ方法が使用されます。この方法は、ゾーン・マップを定義する問合せを実行することによって実装されます。完全リフレッシュを要求すると、高速リフレッシュが実行可能であっても、完全リフレッシュが実行されます。

FORCE

FORCEを指定すると、リフレッシュ時に、高速リフレッシュが可能な場合は高速リフレッシュを実行し、可能でない場合は完全リフレッシュを実行するように指定できます。これはデフォルトです。

ON DEMAND

ON DEMANDを指定すると、ALTER MATERIALIZED ZONEMAP ... REBUILD文を手動で発行しない場合にデータベースでゾーン・マップがリフレッシュされません。この句を指定する場合、ゾーン・マップがREFRESH ON DEMANDモードのゾーン・マップと呼ばれます。ゾーン・マップの再作成の詳細は、ALTER MATERIALIZED ZONEMAPのドキュメントのREBUILDを参照してください。

ON COMMIT

ON COMMITを指定すると、ゾーン・マップの実表に対するトランザクションをコミットするときに、必ずリフレッシュが発生します。この句を指定する場合、ゾーン・マップがREFRESH ON COMMITモードのゾーン・マップと呼ばれます。この句を指定すると、リフレッシュ操作がコミット処理の一部として行われるため、コミットの完了に時間がかかります。

ON LOAD

ON LOADを指定すると、INSERTまたはMERGE操作のいずれかの結果として実行されるダイレクト・パス・インサート(シリアルまたはパラレル)の最後にリフレッシュが発生します。

ON DATA MOVEMENT

ON DATA MOVEMENTを指定すると、次のデータ移動操作の最後にリフレッシュが発生します。

  • DBMS_REDEFINITIONパッケージを使用したデータの再定義

  • ALTER TABLEの次の句で指定される表パーティションのメンテナンス操作: coalesce_tablemerge_table_partitionsmove_table_partitionおよびsplit_table_partition

ON LOAD DATA MOVEMENT

ON LOAD DATA MOVEMENTを指定すると、ダイレクト・パス・インサートまたはデータ移動操作の最後にリフレッシュが発生します。これはデフォルトです。

ENABLE | DISABLE PRUNING

この句を使用すると、プルーニングのゾーン・マップの使用を制御できます。

  • ENABLE PRUNINGを指定して、プルーニングのゾーン・マップの使用を有効化します。これはデフォルトです。

  • DISABLE PRUNINGを指定して、プルーニングのゾーン・マップの使用を無効化します。オプティマイザはプルーニングのゾーン・マップを使用しませんが、データベースは継続してゾーン・マップを保持します。

設定がENABLE PRUNINGである場合、オプティマイザは、次の条件のいずれかを含むSQL操作中にプルーニングのゾーン・マップの使用を検討します。

  • 比較条件: =<=<>=>

    片側が列名で反対側がリテラルまたはバインド変数の簡単な比較条件である必要があります。たとえば:

    WHERE country_name = 'United States of America'
    WHERE country_name = :country1
    WHERE 10000 >= salary
    
  • IN条件

    IN条件は、左側に列名、右側にリテラルまたはバインド変数の式リストを指定する必要があります。たとえば:

    WHERE country_name IN ('Germany', 'India', 'United Kingdom')
    WHERE country_name IN (:country1, :country2, :country3)
    WHERE prod_id IN (20, 48, 132, 143)
    
  • LIKE条件

    LIKE条件は、左側に列名、右側にテキスト・リテラルを指定する必要があります。テキスト・リテラルはLIKE条件のパターンで、少なくとも1つのパターン一致文字を含む必要があります。有効なパターン一致文字は、1つの文字と完全に一致するアンダースコア(_)およびゼロ以上の文字と一致するパーセント記号(%)です。パターンの最初の文字にパターン一致文字を指定できません。たとえば:

    WHERE prod_name LIKE 'DVD%'
    WHERE prod_name LIKE 'Model%Cordless%Battery'
    WHERE prod_name LIKE 'CD%Pack of _'

関連項目:

条件の詳細は、「条件」を参照してください。

ゾーン・マップの制限事項

ゾーン・マップには、次の制限事項があります。

  • 最大で1つのゾーン・マップにファクト表を指定できます。複数のゾーン・マップにディメンション表を指定できます。1つのゾーン・マップにファクト表を指定し、他のゾーン・マップにディメンション表を指定できます。

  • ゾーン・マップの実表に外部表、索引構成表、リモート表、一時表またはビューを指定できません。

  • ゾーン・マップの実表は、ユーザーSYSのスキーマ内に指定できません。

  • ゾーン・マップはパーティション化できます。

  • BFILEBLOBCLOBLONGLONG RAWまたはNCLOB以外のスカラー・データ型の列のゾーン・マップを定義できます。

  • ゾーン・マップの定義する副問合せで指定されるすべての結合は、左側のファクト表の左側外部等価結合である必要があります。

  • ゾーン・マップの定義する副問合せのFROM句がマテリアライズド・ビューを参照する場合、ゾーン・マップのリフレッシュの前に、マテリアライズド・ビューをリフレッシュしておく必要があります。

  • ゾーン・マップで直接DML操作を実行できません。

  • ゾーン・マップの各列には、宣言された照合BINARYまたはUSING_NLS_COMPのいずれかが必要です。

次の文は、sales_zmapと呼ばれる基本的なゾーン・マップを作成します。このゾーン・マップは、表salesの列cust_idおよびprod_idを追跡します。

CREATE MATERIALIZED ZONEMAP sales_zmap
  ON sales(cust_id, prod_id);

次の文は、前の例で作成されたゾーン・マップと似ているsales_zmapと呼ばれる基本的なゾーン・マップを作成します。ただし、この文は定義する副問合せを使用して、ゾーン・マップを作成します。

CREATE MATERIALIZED ZONEMAP sales_zmap
  AS SELECT SYS_OP_ZONE_ID(rowid),
            MIN(cust_id), MAX(cust_id),
            MIN(prod_id), MAX(prod_id)
     FROM sales
     GROUP BY SYS_OP_ZONE_ID(rowid);

次の文は、sales_zmapと呼ばれる結合ゾーン・マップを作成します。ゾーン・マップのファクト表はsalesで、ゾーン・マップに1つのディメンション表customersがあります。このゾーン・マップは、ディメンション表の2つの列cust_state_provinceおよびcust_cityを追跡します。

CREATE MATERIALIZED ZONEMAP sales_zmap
  AS SELECT SYS_OP_ZONE_ID(s.rowid),
            MIN(cust_state_province), MAX(cust_state_province),
            MIN(cust_city), MAX(cust_city)
     FROM sales s
          LEFT OUTER JOIN customers c ON s.cust_id = c.cust_id
     GROUP BY SYS_OP_ZONE_ID(s.rowid);

次の文は、sales_zmapと呼ばれる結合ゾーン・マップを作成します。ゾーン・マップのファクト表はsalesで、ゾーン・マップに2つのディメンション表productscustomersがあります。このゾーン・マップは、products表のprod_categoryprod_subcategorycustomers表のcountry_idcust_state_provinceおよびcust_cityのディメンション表の5個の列を追跡します。

CREATE MATERIALIZED ZONEMAP sales_zmap
  AS SELECT SYS_OP_ZONE_ID(s.rowid),
            MIN(prod_category), MAX(prod_category),
            MIN(prod_subcategory), MAX(prod_subcategory),
            MIN(country_id), MAX(country_id),
            MIN(cust_state_province), MAX(cust_state_province),
            MIN(cust_city), MAX(cust_city)
    FROM sales s
       LEFT OUTER JOIN products p ON s.prod_id = p.prod_id
       LEFT OUTER JOIN customers c ON s.cust_id = c.cust_id
    GROUP BY sys_op_zone_id(s.rowid);

次の文は、前の例で作成されたゾーン・マップと同じ結合ゾーン・マップを作成します。違いは、前の例がFROM句にLEFT OUTER JOIN構文を使用し、次の例がWHERE句に外部結合演算子(+)を使用しているだけです。

CREATE MATERIALIZED ZONEMAP sales_zmap
  AS SELECT SYS_OP_ZONE_ID(s.rowid),
            MIN(prod_category), MAX(prod_category),
            MIN(prod_subcategory), MAX(prod_subcategory),
            MIN(country_id), MAX(country_id),
            MIN(cust_state_province), MAX(cust_state_province),
            MIN(cust_city), MAX(cust_city)
     FROM sales s, products p, customers c
     WHERE s.prod_id = p.prod_id(+) AND
           s.cust_id = c.cust_id(+)
     GROUP BY sys_op_zone_id(s.rowid);