用途
CREATE CLUSTER文を使用すると、クラスタを作成できます。クラスタとは、1つ以上の表のデータが含まれているスキーマ・オブジェクトのことです。
索引クラスタには複数の表が含まれている必要があり、クラスタ内のすべての表には1つ以上の共通の列があります。Oracle Databaseでは、同一のクラスタ・キーを共有するすべての表からすべての行がまとめて格納されます。
ハッシュ・クラスタ(1つ以上の表を含むことが可能)には、同一のハッシュ・キー値を持つ行がまとめて格納されます。
既存のクラスタの情報を取得するには、データ・ディクショナリ・ビューUSER_CLUSTERS、ALL_CLUSTERSおよびDBA_CLUSTERSを問い合せます。
| 
 関連項目: 
  | 
前提条件
自分のスキーマにクラスタを作成する場合は、CREATE CLUSTERシステム権限が必要です。他のユーザーのスキーマ内にクラスタを作成する場合は、CREATE ANY CLUSTERシステム権限が必要です。また、クラスタを設定するスキーマの所有者は、クラスタが定義されている表領域に対する領域の割当て制限、またはUNLIMITED TABLESPACEシステム権限のいずれかが必要です。
クラスタを最初に作成する場合は、Oracle Databaseはクラスタに対する索引を自動的に作成しません。このため、CREATE INDEX文でクラスタ索引を作成するまでは、索引クラスタのクラスタ表に対して、データ操作言語(DML)文を発行できません。
構文
create_cluster::=

(physical_attributes_clause::=、size_clause::=を参照)

(storage_clause::=を参照)
parallel_clause ::=

セマンティクス
schema
作成するクラスタが定義されるスキーマを指定します。schemaを指定しない場合、現行のスキーマにクラスタが作成されます。
cluster
作成するクラスタの名前を指定します。
クラスタを作成した後、そのクラスタに表を追加します。クラスタには、最大32個の表を指定できます。オブジェクト表、およびLOB列またはOracleが提供するAny*型の列を含む表はクラスタの一部にはできません。クラスタを作成し、そのクラスタに表を追加しても、クラスタを意識する必要はありません。クラスタ化されていない表と同様に、SQL文を使用してクラスタ化表にアクセスできます。
column
クラスタ・キーに1つ以上の列名を指定します。最大16個のクラスタ・キー列を指定できます。これらの列は、データ型およびサイズについて、各クラスタ化表の列と対応している必要があります。名前は対応している必要はありません。
クラスタ・キー列の定義の一部として整合性制約は指定できません。そのかわり、クラスタに属している表に整合性制約を対応付けることができます。
datatype
各クラスタ・キー列のデータ型を指定します。
クラスタのデータ型の制限事項: クラスタのデータ型には、次の制限事項があります。
データ型がLONG、LONG RAW、REF、ネストした表、VARRAY、BLOB、CLOB、BFILE、Oracleが提供する型Any*またはユーザー定義オブジェクト型であるクラスタ・キー列は指定できません。
ROWID型の列を指定することはできますが、それらの列の値が有効な行IDであることは保証されません。
SORTキーワードは、ハッシュ・クラスタを作成する場合にのみ有効です。この句を指定すると、DML操作を実行するときに、Oracle Databaseに対して、ハッシュ・ファンクションを適用した後でこの列でクラスタの行をソートするように指示できます。これによって、クラスタ化データでの後続の問合せ時に、応答時間が短縮される場合があります。ハッシュ・クラスタの作成については、「HASHKEYS句」を参照してください。
ソートされたハッシュ・クラスタの制限事項 ソートされたハッシュ・クラスタでは、行の依存がサポートされません。
physical_attributes_clauseを使用すると、クラスタの記憶特性を指定できます。クラスタ内の各表もこれらの記憶特性を使用します。これらのパラメータの値を指定しない場合、次のデフォルトが使用されます。
PCTFREE: 10
PCTUSED: 40
INITRANS: 2、またはクラスタを含む表領域のデフォルト値のいずれか大きい方
同一クラスタ・キー値または同一ハッシュ値を持つすべての行を格納するために確保する領域を、バイト単位で指定します。次に、この領域によって、データ・ブロックごとに格納されるクラスタやハッシュ値の最大値が決まります。SIZEの値がデータ・ブロック・サイズの約数でない場合、Oracle Databaseは、次に大きい約数を使用します。SIZEがデータ・ブロック・サイズより大きい場合、データベースは、クラスタまたはハッシュ値ごとに、1つ以上のデータ・ブロックを確保し、オペレーティング・システムのブロック・サイズを採用します。
また、データベースは、クラスタ・キー値を持つ行に対して確保する必要がある領域を決定する際に、クラスタ・キーの長さを考慮します。クラスタ・キーが大きければ、それに必要なサイズも大きくなります。実際のサイズを参照するには、USER_CLUSTERSデータ・ディクショナリ・ビューのKEY_SIZE列を問い合せます。(ハッシュ値は実際にはクラスタ内に格納されていないため、この値はハッシュ・クラスタには適用されません。)
このパラメータを指定しない場合、クラスタ・キー値またはハッシュ値ごとにデータ・ブロックが1つ確保されます。
クラスタを作成する表領域を指定します。
INDEXを指定すると、索引クラスタを作成できます。索引クラスタには、同一のクラスタ・キー値が指定されている行がまとめて格納されます。それぞれのクラスタ・キー値は、そのキーを持つ表および行の数に関係なく、各データ・ブロックに1回のみ格納されます。INDEXもHASHKEYSも指定しない場合は、デフォルトで索引クラスタが作成されます。
索引クラスタの作成後、クラスタ内の表に対してデータ操作言語(DML)文を発行する前に、そのクラスタ・キーに索引を作成する必要があります。この索引をクラスタ索引と呼びます。
ハッシュ・クラスタに対してクラスタ索引は作成できないため、ハッシュ・クラスタ・キーで索引を作成する必要はありません。
HASHKEYSを指定すると、ハッシュ・クラスタを作成し、ハッシュ・クラスタのハッシュ値の数を指定できます。ハッシュ・クラスタには、同一のハッシュ・キー値を持つ行がまとめて格納されます。それぞれの行のハッシュ値は、そのクラスタのハッシュ・ファンクションが戻す値です。
Oracle Databaseは、ハッシュ値の実際の数を決めるため、HASHKEYS値を一番近い次の素数に切り上げます。このパラメータの最小値は2です。INDEX句とHASHKEYSパラメータの両方を指定しないとき、デフォルトで索引クラスタが作成されます。
ハッシュ・クラスタの作成時に、データベースは、SIZEパラメータおよびHASHKEYSパラメータの値に基づいて、クラスタに領域を割り当てます。
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を使用すると、クラスタの作成をパラレル化できます。
この句の詳細は、「CREATE TABLE」の「parallel_clause」を参照してください。
NOROWDEPENDENCIES | ROWDEPENDENCIES
この句のクラスタに対する動作は、表に対する動作と同じです。詳細は、「CREATE TABLE」の「NOROWDEPENDENCIES | ROWDEPENDENCIES」を参照してください。
CACHE CACHEを指定すると、全表スキャンの実行時に、このクラスタに対して取り出されたブロックを、バッファ・キャッシュ内の最高使用頻度(LRU)リストの最高使用頻度側に入れることができます。この句は、小規模な参照表で有効です。
NOCACHE NOCACHEを指定すると、全表スキャンの実行時に、このクラスタに対して取り出されたブロックを、バッファ・キャッシュ内のLRUリストの最低使用頻度側に入れることができます。これはデフォルトの動作です。
NOCACHEは、storage_clauseにKEEPを指定したクラスタには影響しません。
例
クラスタの作成例: 次の文は、クラスタ・キー列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;