注意: CREATE MATERIALIZED ZONEMAP 文は、Oracle Database 12cリリース1(12.1.0.2)から使用可能です。 |
用途
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 TABLEのattribute_clustering_clause
およびALTER TABLEの
attribute_clustering_clause
句を参照してください。
属性クラスタ表の作成時または変更時にWITH
MATERIALIZED
ZONEMAP
句を指定します。詳細は、CREATE TABLEのzonemap_clause
およびALTER
TABLE
のMODIFY 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::=
注意: 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_block
の
SELECT
、FROM
、WHERE
および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
この句を使用してゾーン・マップの次の属性を指定します: TABLESPACE
、SCALE
、PCTFREE
、PCTUSED
および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
この句を使用して、ゾーン・マップのデフォルトのリフレッシュ方法およびモードを指定します。リフレッシュ方法(FAST
、COMPLETE
または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_table
、merge_table_partitions
、move_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
のスキーマ内に指定できません。
ゾーン・マップはパーティション化できます。
BFILE
、BLOB
、CLOB
、LONG
、LONG
RAW
またはNCLOB
以外のスカラー・データ型の列のゾーン・マップを定義できます。
ゾーン・マップの定義する副問合せで指定されるすべての結合は、左側のファクト表の左側外部等価結合である必要があります。
ゾーン・マップの定義する副問合せのFROM
句がマテリアライズド・ビューを参照する場合、ゾーン・マップのリフレッシュの前に、マテリアライズド・ビューをリフレッシュしておく必要があります。
ゾーン・マップで直接DML操作を実行できません。
例
次の文は、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つのディメンション表products
とcustomers
があります。このゾーン・マップは、products
表のprod_category
とprod_subcategory
、customers
表のcountry_id
、cust_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);