CREATE CLUSTER
目的
CREATE
CLUSTER
文を使用すると、クラスタを作成できます。クラスタとは、1つ以上の表のデータが含まれているスキーマ・オブジェクトのことです。
-
索引クラスタには複数の表が含まれている必要があり、クラスタ内のすべての表には1つ以上の共通の列があります。Oracle Databaseでは、同一のクラスタ・キーを共有するすべての表からすべての行がまとめて格納されます。
-
ハッシュ・クラスタ(1つ以上の表を含むことが可能)には、同一のハッシュ・キー値を持つ行がまとめて格納されます。
既存のクラスタの情報を取得するには、データ・ディクショナリ・ビューUSER_CLUSTERS
、ALL_CLUSTERS
およびDBA_CLUSTERS
を問い合せます。
関連項目:
-
クラスタの概要は、『Oracle Database概要』を参照してください。
-
クラスタを使用するタイミングについては、『Oracle Database SQLチューニング・ガイド』を参照してください。
-
データ・ディクショナリ・ビューの詳細は、『Oracle Databaseリファレンス』を参照してください。
前提条件
自分のスキーマにクラスタを作成する場合は、CREATE
CLUSTER
システム権限が必要です。他のユーザーのスキーマ内にクラスタを作成する場合は、CREATE
ANY
CLUSTER
システム権限が必要です。また、クラスタを設定するスキーマの所有者は、クラスタが定義されている表領域に対する領域の割当て制限、またはUNLIMITED
TABLESPACE
システム権限のいずれかが必要です。
クラスタを最初に作成する場合は、Oracle Databaseはクラスタに対する索引を自動的に作成しません。このため、CREATE
INDEX
文でクラスタ索引を作成するまでは、索引クラスタのクラスタ表に対して、データ操作言語(DML)文を発行できません。
構文
create_cluster::=
(physical_attributes_clause::=、size_clause::=、cluster_range_partitions::=)
parallel_clause::=
cluster_range_partitions::=
セマンティクス
IF NOT EXISTS
IF NOT EXISTS
を指定すると、次の効果が得られます。
-
クラスタが存在していない場合は、文の最後に新しいクラスタが作成されます。
-
クラスタが存在している場合、これは文の最後の時点にあるクラスタになります。古いクラスタが検出されるため、新しいものは作成されません。
IF EXISTS
はCREATE
とともに使用すると、ORA-11543: Incorrect IF NOT EXISTS clause for CREATE statement
が発生します。
schema
作成するクラスタが定義されるスキーマを指定します。schema
を指定しない場合、現行のスキーマにクラスタが作成されます。
cluster
作成するクラスタの名前を指定します。名前は、「データベース・オブジェクトのネーミング規則」に指定されている要件を満たしている必要があります。
クラスタを作成した後、そのクラスタに表を追加します。クラスタには、最大32個の表を指定できます。オブジェクト表、およびLOB列またはOracleが提供するAny*
型の列を含む表はクラスタの一部にはできません。クラスタを作成し、そのクラスタに表を追加しても、クラスタを意識する必要はありません。クラスタ化されていない表と同様に、SQL文を使用してクラスタ化表にアクセスできます。
関連項目:
クラスタへの表の追加の詳細は、「CREATE TABLE」、「クラスタの作成: 例」および「クラスタへの表の追加: 例」を参照してください。
SHARING
SHARING句は、アプリケーションのメンテナンスの際に、アプリケーション・ルートにクラスタを作成する場合に使用します。このタイプのオブジェクトはアプリケーション共通オブジェクトと呼ばれ、アプリケーション・ルートに属するアプリケーションPDBと共有できます。
次の共有属性のいずれかを使用して、オブジェクトを共有する方法を指定できます。
-
METADATA
- メタデータ・リンクはメタデータを共有しますが、そのデータは各コンテナに固有です。このタイプのオブジェクトは、メタデータリンク・アプリケーション共通オブジェクトと呼ばれます。 -
NONE
- オブジェクトは共有されず、アプリケーション・ルートでのみアクセスできます。
column
クラスタ・キーに1つ以上の列名を指定します。最大16個のクラスタ・キー列を指定できます。これらの列は、データ型およびサイズについて、各クラスタ化表の列と対応している必要があります。名前は対応している必要はありません。
クラスタ・キー列の定義の一部として整合性制約は指定できません。そのかわり、クラスタに属している表に整合性制約を対応付けることができます。
関連項目:
datatype
各クラスタ・キー列のデータ型を指定します。
クラスタ・データ型の制限事項
クラスタ・データ型には、次の制限事項があります。
-
データ型が
LONG
、LONG
RAW
、REF
、ネストした表、VARRAY、BLOB
、CLOB
、BFILE
、Oracleが提供する型Any*
またはユーザー定義オブジェクト型であるクラスタ・キー列は指定できません。 -
ROWID
型の列を指定することはできますが、それらの列の値が有効な行IDであることは保証されません。
関連項目:
データ型の詳細は、「データ型」を参照してください。
COLLATE
この句を使用すると、クラスタ・キーの文字データ型列にデータ・バインドされた照合を指定できます。
column_collation_name
には、次のように照合を指定します。
-
索引クラスタまたはソートされたハッシュ・クラスタを作成する場合、
BINARY
、USING_NLS_COMP
、USING_NLS_SORT
またはUSING_NLS_SORT_CS
のいずれかの照合を指定できます。 -
ソートされていないハッシュ・クラスタを作成する場合、任意の有効な名前付き照合または疑似照合を指定できます。
この句を指定しない場合、クラスタ・キー内の列は、クラスタを含むスキーマの、有効なスキーマのデフォルトの照合を継承します。有効なスキーマのデフォルトの照合の詳細は、「ALTER
SESSION
」のDEFAULT_COLLATION句を参照してください。
クラスタ・キー列の照合は、クラスタ内で作成された表の対応する列の照合と一致する必要があります。
COLLATE
句を指定できるのは、COMPATIBLE
初期化パラメータが12.2
以上に設定され、かつMAX_STRING_SIZE
初期化パラメータがEXTENDED
に設定されている場合のみです。
クラスタ・キー列の照合を変更するには、クラスタを再作成する必要があります。
SORT
SORT
キーワードは、ハッシュ・クラスタを作成する場合にのみ有効です。表の行はSORT
のないクラスタ・キー列のバケットにハッシュされ、この句を使用して、列の各バケット内でソートされます。これによって、クラスタ化データでの後続の問合せ時に、応答時間が短縮される場合があります。
SORT
句のないすべての列は、CREATE CLUSTER
文のSORT
句を持つすべての列の前に指定する必要があります。
ソートされたハッシュ・クラスタの制限事項
ソートされたハッシュ・クラスタでは、行依存性はサポートされません。
関連項目:
-
ハッシュ・クラスタの作成の詳細は、「HASHKEYS句」を参照してください。
-
詳細は、ハッシュ・クラスタの管理を参照してください。
physical_attributes_clause
physical_attributes_clause
を使用すると、クラスタの記憶特性を指定できます。クラスタ内の各表もこれらの記憶特性を使用します。これらのパラメータの値を指定しない場合、次のデフォルトが使用されます。
-
PCTFREE
: 10 -
PCTUSED
: 40 -
INITRANS
: 2、またはクラスタを含む表領域のデフォルト値のいずれか大きい方関連項目:
これらの句の詳細は、「physical_attributes_clause」および「storage_clause」を参照してください。
SIZE
同一クラスタ・キー値または同一ハッシュ値を持つすべての行を格納するために確保する領域を、バイト単位で指定します。次に、この領域によって、データ・ブロックごとに格納されるクラスタやハッシュ値の最大値が決まります。SIZE
の値がデータ・ブロック・サイズの約数でない場合、Oracle Databaseは、次に大きい約数を使用します。SIZE
がデータ・ブロック・サイズより大きい場合、データベースは、クラスタまたはハッシュ値ごとに、1つ以上のデータ・ブロックを確保し、オペレーティング・システムのブロック・サイズを採用します。
また、データベースは、クラスタ・キー値を持つ行に対して確保する必要がある領域を決定する際に、クラスタ・キーの長さを考慮します。クラスタ・キーが大きければ、それに必要なサイズも大きくなります。実際のサイズを参照するには、USER_CLUSTERS
データ・ディクショナリ・ビューのKEY_SIZE
列を問い合せます。(ハッシュ値は実際にはクラスタ内に格納されていないため、この値はハッシュ・クラスタには適用されません。)
このパラメータを指定しない場合、クラスタ・キー値またはハッシュ値ごとにデータ・ブロックが1つ確保されます。
INDEX句
INDEX
を指定すると、索引クラスタを作成できます。索引クラスタには、同一のクラスタ・キー値が指定されている行がまとめて格納されます。それぞれのクラスタ・キー値は、そのキーを持つ表および行の数に関係なく、各データ・ブロックに1回のみ格納されます。INDEX
もHASHKEYS
も指定しない場合は、デフォルトで索引クラスタが作成されます。
索引クラスタの作成後、クラスタ内の表に対してデータ操作言語(DML)文を発行する前に、そのクラスタ・キーに索引を作成する必要があります。この索引をクラスタ索引と呼びます。
ハッシュ・クラスタに対してクラスタ索引は作成できないため、ハッシュ・クラスタ・キーで索引を作成する必要はありません。
関連項目:
クラスタ索引の作成方法の詳細は「CREATE INDEX」、索引クラスタの概要は『Oracle Database概要』を参照してください。
HASHKEYS句
HASHKEYS
を指定すると、ハッシュ・クラスタを作成し、ハッシュ・クラスタのハッシュ値の数を指定できます。ハッシュ・クラスタには、同一のハッシュ・キー値を持つ行がまとめて格納されます。それぞれの行のハッシュ値は、そのクラスタのハッシュ・ファンクションが戻す値です。
Oracle Databaseは、ハッシュ値の実際の数を決めるため、HASHKEYS
値を一番近い次の素数に切り上げます。このパラメータの最小値は2です。INDEX
句とHASHKEYS
パラメータの両方を指定しないとき、デフォルトで索引クラスタが作成されます。
ハッシュ・クラスタの作成時に、データベースは、SIZE
パラメータおよびHASHKEYS
パラメータの値に基づいて、クラスタに領域を割り当てます。
関連項目:
クラスタに領域を割り当てる方法の詳細は、『Oracle Database概要』および「ハッシュ・クラスタ: 例」を参照してください。
SINGLE
TABLE
を指定すると、表を1つのみ持つタイプのハッシュ・クラスタを作成できます。この句によって、表の行へのアクセスがより高速になります。
単一表クラスタの制限事項
クラスタ内で一度に存在できる表は1つのみです。ただし、表を削除して、同一のクラスタに別の表を作成することはできます。
関連項目:
HASH IS expr
ハッシュ・クラスタのハッシュ・ファンクションとして使用する式を指定します。式には、次の制限事項があります。
-
正の値に評価される必要があります。
-
式全体の値が位取り0(ゼロ)の数になる場合は、任意のデータ型の列が参照される1つ以上の列を持つ必要があります。たとえば、
number_column
*LENGTH
(varchar2_column
)です。 -
ユーザー定義のPL/SQLファンクションを参照できません。
-
疑似列
LEVEL
またはROWNUM
を参照できません。 -
ユーザー関連ファンクション(
USERENV
、UID
およびUSER
)または日時ファンクション(CURRENT_DATE
、CURRENT_TIMESTAMP
、DBTIMEZONE
、EXTRACT
(日時)、FROM_TZ
、LOCALTIMESTAMP
、NUMTODSINTERVAL
、NUMTOYMINTERVAL
、SESSIONTIMEZONE
、SYSDATE
、SYSTIMESTAMP
、TO_DSINTERVAL
、TO_TIMESTAMP
、TO_DATE
、TO_TIMESTAMP_TZ
、TO_YMINTERVAL
およびTZ_OFFSET
)を参照できません。 -
定数に評価されることはありません。
-
スカラー副問合せ式には指定できません。
-
(クラスタ名ではなく)スキーマ名またはオブジェクト名で修飾された列を持つことができません。
HASH
IS
句を指定しない場合、Oracle Databaseはハッシュ・クラスタに対して内部ハッシュ・ファンクションを使用します。
既存のハッシュ・ファンクションの詳細は、データ・ディクショナリ表USER_CLUSTER_HASH_EXPRESSIONS
、ALL_CLUSTER_HASH_EXPRESSIONS
およびDBA_CLUSTER_HASH_EXPRESSIONS
に問い合せます。
ハッシュ列のクラスタ・キーは、任意のデータ型で構成される1つ以上の列を持つことができます。複合クラスタ・キー、または整数以外の列で構成されるクラスタ・キーを持つハッシュ・クラスタに対しては、内部ハッシュ・ファンクションを使用する必要があります。
関連項目:
データ・ディクショナリ・ビューの詳細は、『Oracle Databaseリファレンス』を参照してください。
parallel_clause
parallel_clause
を使用すると、クラスタの作成をパラレル化できます。
この句の詳細は、「CREATE
TABLE
」の「parallel_clause」を参照してください。
NOROWDEPENDENCIES | ROWDEPENDENCIES
この句のクラスタに対する動作は、表に対する動作と同じです。詳細は、「CREATE
TABLE
」の「NOROWDEPENDENCIES | ROWDEPENDENCIES」を参照してください。
CACHE | NOCACHE
全表スキャンの実行時に、このクラスタに対して取り出されたブロックをバッファ・キャッシュの最低使用頻度リスト(LRU)の最高使用頻度側に配置する場合は、CACHE
を指定します。この句は、小規模な参照表で有効です。
NOCACHE
NOCACHE
を指定すると、全表スキャンの実行時に、このクラスタに対して取り出されたブロックを、バッファ・キャッシュ内のLRUリストの最低使用頻度側に入れることができます。これはデフォルトの動作です。
NOCACHE
は、storage_clause
にKEEP
を指定したクラスタには影響しません。
cluster_range_partitions
cluster_range_partitions
句を指定すると、レンジ・パーティション・ハッシュ・クラスタを作成できます。この句を指定する場合は、HASHKEYS
句も指定する必要があります。
cluster_range_partitions
句を使用すると、列リストの値の範囲でクラスタをパーティション化できます。レンジ・パーティション・ハッシュ・クラスタに表を追加すると、この表は、そのクラスタと同じパーティション数で、同じ列の同じパーティション境界に自動的にパーティション化されます。Oracle Databaseは、表パーティションにシステム生成の名前を割り当てます。
文字データ型が指定された各パーティション化キー列には、宣言された照合BINARY
、USING_NLS_COMP
、USING_NLS_SORT
またはUSING_NLS_SORT_CS
のいずれかが必要です。
INTERVAL
句を指定できない点を除いて、cluster_range_partitions
句は、CREATE
TABLE
のrange_partitions
句と同じセマンティクスを持ちます。詳細は、CREATE
TABLE
のドキュメントのrange_partitionsを参照してください。
関連項目:
例
クラスタの作成: 例
次の文は、クラスタ・キー列department
、クラスタ・サイズ512バイトおよび記憶域パラメータ値を指定したクラスタpersonnel
を作成します。
CREATE CLUSTER personnel (department NUMBER(4)) SIZE 512 STORAGE (initial 100K next 50K);
クラスタ・キー: 例
次の文は、personnel
のクラスタ・キーに対するクラスタ索引を作成します。
CREATE INDEX idx_personnel ON CLUSTER personnel;
クラスタ索引の作成後、索引に表を追加し、その表に対してDML操作を行うことができます。
クラスタへの表の追加: 例
次の文は、サンプル表hr.employees
から部門表を作成し、前述の例で作成したpersonnelクラスタに追加します。
CREATE TABLE dept_10 CLUSTER personnel (department_id) AS SELECT * FROM employees WHERE department_id = 10; CREATE TABLE dept_20 CLUSTER personnel (department_id) AS SELECT * FROM employees WHERE department_id = 20;
ハッシュ・クラスタ: 例
次の文は、クラスタ・キー列cust_language
、最大ハッシュ・キー値10 (各サイズ512バイト)および記憶域パラメータ値を指定したハッシュ・クラスタlanguage
を作成します。
CREATE CLUSTER language (cust_language VARCHAR2(3)) SIZE 512 HASHKEYS 10 STORAGE (INITIAL 100k next 50k);
この文では、HASH
IS
句を指定していないため、Oracle Databaseは、そのクラスタに対して内部ハッシュ・ファンクションを採用します。
次の文は、postal_code
とcountry_id
列で構成されるクラスタ・キーを持つaddress
という名前のハッシュ・クラスタを作成し、これらの列を含むSQL式をハッシュ・ファンクションに使用します。
CREATE CLUSTER address (postal_code NUMBER, country_id CHAR(2)) HASHKEYS 20 HASH IS MOD(postal_code + country_id, 101);
単一表ハッシュ・クラスタの例
次の文は、クラスタ・キーcustomer_id
および最大ハッシュ・キー値100 (各サイズ512バイト)を指定した単一表ハッシュ・クラスタcust_orders
を作成します。
CREATE CLUSTER cust_orders (customer_id NUMBER(6)) SIZE 512 SINGLE TABLE HASHKEYS 100;
レンジ・パーティション・ハッシュ・クラスタ: 例
次の文は、販売額を基準にして5つの範囲にパーティション化された、sales
というレンジ・パーティション・ハッシュ・クラスタを作成します。クラスタ・キーは、amount_sold
列とprod_id
列で構成されます。このクラスタは、ハッシュ・ファンクション(amount_sold * 10 + prod_id)
を使用して、最大100,000個のハッシュ・キー値を保持します。このキー値には、それぞれ300バイトが割り当てられます。
CREATE CLUSTER sales (amount_sold NUMBER, prod_id NUMBER) HASHKEYS 100000 HASH IS (amount_sold * 10 + prod_id) SIZE 300 TABLESPACE example PARTITION BY RANGE (amount_sold) (PARTITION p1 VALUES LESS THAN (2001), PARTITION p2 VALUES LESS THAN (4001), PARTITION p3 VALUES LESS THAN (6001), PARTITION p4 VALUES LESS THAN (8001), PARTITION p5 VALUES LESS THAN (MAXVALUE));
クラスタ表の作成: 例
次の文は、デフォルトのキー・サイズ(600)を使用して、emp_dept
という名前のクラスタを作成します。
CREATE CLUSTER emp_dept (deptno NUMBER(3))
SIZE 600
TABLESPACE USERS
STORAGE (INITIAL 200K
NEXT 300K
MINEXTENTS 2
PCTINCREASE 33);
次の文は、emp_dept
クラスタの下にdept
という名前のクラスタ表を作成します。
CREATE TABLE dept (
deptno NUMBER(3) PRIMARY KEY)
CLUSTER emp_dept (deptno);
次の文は、emp_dept
クラスタの下にempl
という名前の別のクラスタ表を作成します。
CREATE TABLE empl (
emplno NUMBER(5) PRIMARY KEY,
emplname VARCHAR2(15) NOT NULL,
deptno NUMBER(3) REFERENCES dept)
CLUSTER emp_dept (deptno);
次の文は、emp_dept
クラスタに対する索引を作成します。
CREATE INDEX emp_dept_index
ON CLUSTER emp_dept
TABLESPACE USERS
STORAGE (INITIAL 50K
NEXT 50K
MINEXTENTS 2
MAXEXTENTS 10
PCTINCREASE 33);
次の文は、USER_CLUSTERS
を問い合せてクラスタ・メタデータを表示します。
SELECT CLUSTER_NAME, TABLESPACE_NAME, CLUSTER_TYPE, PCT_INCREASE, MIN_EXTENTS, MAX_EXTENTS FROM USER_CLUSTERS;
CLUSTER_NAME TABLESPACE CLUST PCT_INCREASE MIN_EXTENTS MAX_EXTENTS
--------------- ---------- ----- ------------ ----------- -----------
EMP_DEPT USERS INDEX 1 2147483645
次の文は、USER_CLU_COLUMNS
を問い合せてクラスタ・メタデータを表示します。
SELECT * FROM USER_CLU_COLUMNS;
CLUSTER_NAME CLU_COLUMN_NAME TABLE_NAME TAB_COLUMN_NAME
--------------- -------------------- ---------- --------------------
EMP_DEPT DEPTNO DEPT DEPTNO
EMP_DEPT DEPTNO EMPL DEPTNO
次の文は、USER_INDEXES
を問い合せて、emp_dept
クラスタの索引属性を表示します。
SELECT INDEX_NAME, INDEX_TYPE, PCT_INCREASE, MIN_EXTENTS, MAX_EXTENTS FROM USER_INDEXES WHERE TABLE_NAME='EMP_DEPT';
INDEX_NAME INDEX_TYPE PCT_INCREASE MIN_EXTENTS MAX_EXTENTS
--------------- --------------- ------------ ----------- -----------
EMP_DEPT_INDEX CLUSTER 1 2147483645