日本語PDF

13.5 CREATE CLUSTER

目的

CREATE CLUSTER文を使用すると、クラスタを作成できます。クラスタとは、1つ以上の表のデータが含まれているスキーマ・オブジェクトのことです。

  • 索引クラスタには複数の表が含まれている必要があり、クラスタ内のすべての表には1つ以上の共通の列があります。Oracle Databaseでは、同一のクラスタ・キーを共有するすべての表からすべての行がまとめて格納されます。

  • ハッシュ・クラスタ(1つ以上の表を含むことが可能)には、同一のハッシュ・キー値を持つ行がまとめて格納されます。

既存のクラスタの情報を取得するには、データ・ディクショナリ・ビューUSER_CLUSTERSALL_CLUSTERSおよびDBA_CLUSTERSを問い合せます。

関連項目:

前提条件

自分のスキーマにクラスタを作成する場合は、CREATE CLUSTERシステム権限が必要です。他のユーザーのスキーマ内にクラスタを作成する場合は、CREATE ANY CLUSTERシステム権限が必要です。また、クラスタを設定するスキーマの所有者は、クラスタが定義されている表領域に対する領域の割当て制限、またはUNLIMITED TABLESPACEシステム権限のいずれかが必要です。

クラスタを最初に作成する場合は、Oracle Databaseはクラスタに対する索引を自動的に作成しません。このため、CREATE INDEX文でクラスタ索引を作成するまでは、索引クラスタのクラスタ表に対して、データ操作言語(DML)文を発行できません。

構文

parallel_clause::=

セマンティクス

schema

作成するクラスタが定義されるスキーマを指定します。schemaを指定しない場合、現行のスキーマにクラスタが作成されます。

cluster

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

クラスタを作成した後、そのクラスタに表を追加します。クラスタには、最大32個の表を指定できます。オブジェクト表、およびLOB列またはOracleが提供するAny*型の列を含む表はクラスタの一部にはできません。クラスタを作成し、そのクラスタに表を追加しても、クラスタを意識する必要はありません。クラスタ化されていない表と同様に、SQL文を使用してクラスタ化表にアクセスできます。

関連項目:

クラスタへの表の追加の詳細は、「CREATE TABLE」「クラスタの作成: 例」および「クラスタへの表の追加: 例」を参照してください。

column

クラスタ・キーに1つ以上の列名を指定します。最大16個のクラスタ・キー列を指定できます。これらの列は、データ型およびサイズについて、各クラスタ化表の列と対応している必要があります。名前は対応している必要はありません。

クラスタ・キー列の定義の一部として整合性制約は指定できません。そのかわり、クラスタに属している表に整合性制約を対応付けることができます。

関連項目:

クラスタ・キー: 例

datatype

各クラスタ・キー列のデータ型を指定します。

クラスタ・データ型の制限事項

クラスタ・データ型には、次の制限事項があります。

  • データ型がLONGLONG RAWREF、ネストした表、VARRAY、BLOBCLOBBFILE、Oracleが提供する型Any*またはユーザー定義オブジェクト型であるクラスタ・キー列は指定できません。

  • ROWID型の列を指定することはできますが、それらの列の値が有効な行IDであることは保証されません。

関連項目:

データ型の詳細は、「データ型」を参照してください。

COLLATE

この句を使用すると、クラスタ・キーの文字データ型列にデータ・バインドされた照合を指定できます。

column_collation_nameには、次のように照合を指定します。

  • 索引クラスタまたはソートされたハッシュ・クラスタを作成する場合、BINARYUSING_NLS_COMPUSING_NLS_SORTまたはUSING_NLS_SORT_CSのいずれかの照合を指定できます。

  • ソートされていないハッシュ・クラスタを作成する場合、任意の有効な名前付き照合または疑似照合を指定できます。

この句を指定しない場合、クラスタ・キー内の列は、クラスタを含むスキーマの、有効なスキーマのデフォルトの照合を継承します。有効なスキーマのデフォルトの照合の詳細は、「ALTER SESSION」のDEFAULT_COLLATION句を参照してください。

クラスタ・キー列の照合は、クラスタ内で作成された表の対応する列の照合と一致する必要があります。

COLLATE句を指定できるのは、COMPATIBLE初期化パラメータが12.2以上に設定され、かつMAX_STRING_SIZE初期化パラメータがEXTENDEDに設定されている場合のみです。

クラスタ・キー列の照合を変更するには、クラスタを再作成する必要があります。

SORT

SORTキーワードは、ハッシュ・クラスタを作成する場合にのみ有効です。この句を指定すると、DML操作を実行するときに、Oracle Databaseに対して、ハッシュ・ファンクションを適用した後でこの列でクラスタの行をソートするように指示できます。これによって、クラスタ化データでの後続の問合せ時に、応答時間が短縮される場合があります。

ソートされたハッシュ・クラスタの制限事項

ソートされたハッシュ・クラスタでは、行依存性はサポートされません。

関連項目:

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つ確保されます。

TABLESPACE

クラスタを作成する表領域を指定します。

INDEX句

INDEXを指定すると、索引クラスタを作成できます。索引クラスタには、同一のクラスタ・キー値が指定されている行がまとめて格納されます。それぞれのクラスタ・キー値は、そのキーを持つ表および行の数に関係なく、各データ・ブロックに1回のみ格納されます。INDEXHASHKEYSも指定しない場合は、デフォルトで索引クラスタが作成されます。

索引クラスタの作成後、クラスタ内の表に対してデータ操作言語(DML)文を発行する前に、そのクラスタ・キーに索引を作成する必要があります。この索引をクラスタ索引と呼びます。

ハッシュ・クラスタに対してクラスタ索引は作成できないため、ハッシュ・クラスタ・キーで索引を作成する必要はありません。

関連項目:

クラスタ索引の作成方法の詳細は「CREATE INDEX」、索引クラスタの概要は『Oracle Database概要』を参照してください。

HASHKEYS句

HASHKEYSを指定すると、ハッシュ・クラスタを作成し、ハッシュ・クラスタのハッシュ値の数を指定できます。ハッシュ・クラスタには、同一のハッシュ・キー値を持つ行がまとめて格納されます。それぞれの行のハッシュ値は、そのクラスタのハッシュ・ファンクションが戻す値です。

Oracle Databaseは、ハッシュ値の実際の数を決めるため、HASHKEYS値を一番近い次の素数に切り上げます。このパラメータの最小値は2です。INDEX句とHASHKEYSパラメータの両方を指定しないとき、デフォルトで索引クラスタが作成されます。

ハッシュ・クラスタの作成時に、データベースは、SIZEパラメータおよびHASHKEYSパラメータの値に基づいて、クラスタに領域を割り当てます。

関連項目:

クラスタに領域を割り当てる方法の詳細は、『Oracle Database概要』および「ハッシュ・クラスタ: 例」を参照してください。

SINGLE TABLE

SINGLE TABLEを指定すると、表を1つのみ持つタイプのハッシュ・クラスタを作成できます。この句によって、表の行へのアクセスがより高速になります。

単一表クラスタの制限事項

クラスタ内で一度に存在できる表は1つのみです。ただし、表を削除して、同一のクラスタに別の表を作成することはできます。

HASH IS expr

ハッシュ・クラスタのハッシュ・ファンクションとして使用する式を指定します。式には、次の制限事項があります。

  • 正の値に評価される必要があります。

  • 式全体の値が位取り0(ゼロ)の数になる場合は、任意のデータ型の列が参照される1つ以上の列を持つ必要があります。たとえば、number_column * LENGTH(varchar2_column)です。

  • ユーザー定義のPL/SQLファンクションを参照できません。

  • 疑似列LEVELまたはROWNUMを参照できません。

  • ユーザー関連ファンクション(USERENVUIDおよびUSER)または日時ファンクション(CURRENT_DATECURRENT_TIMESTAMPDBTIMEZONEEXTRACT(日時)、FROM_TZLOCALTIMESTAMPNUMTODSINTERVALNUMTOYMINTERVALSESSIONTIMEZONESYSDATESYSTIMESTAMPTO_DSINTERVALTO_TIMESTAMPTO_DATETO_TIMESTAMP_TZTO_YMINTERVALおよびTZ_OFFSET)を参照できません。

  • 定数に評価されることはありません。

  • スカラー副問合せ式には指定できません。

  • (クラスタ名ではなく)スキーマ名またはオブジェクト名で修飾された列を持つことができません。

HASH IS句を指定しない場合、Oracle Databaseはハッシュ・クラスタに対して内部ハッシュ・ファンクションを使用します。

既存のハッシュ・ファンクションの詳細は、データ・ディクショナリ表USER_CLUSTER_HASH_EXPRESSIONSALL_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

CACHE

全表スキャンの実行時に、このクラスタに対して取り出されたブロックをバッファ・キャッシュの最低使用頻度リスト(LRU)の最高使用頻度側に配置する場合は、CACHEを指定します。この句は、小規模な参照表で有効です。

NOCACHE

NOCACHEを指定すると、全表スキャンの実行時に、このクラスタに対して取り出されたブロックを、バッファ・キャッシュ内のLRUリストの最低使用頻度側に入れることができます。これはデフォルトの動作です。

NOCACHEは、storage_clauseKEEPを指定したクラスタには影響しません。

cluster_range_partitions

cluster_range_partitions句を指定すると、レンジ・パーティション・ハッシュ・クラスタを作成できます。この句を指定する場合は、HASHKEYS句も指定する必要があります。

cluster_range_partitions句を使用すると、列リストの値の範囲でクラスタをパーティション化できます。レンジ・パーティション・ハッシュ・クラスタに表を追加すると、この表は、そのクラスタと同じパーティション数で、同じ列の同じパーティション境界に自動的にパーティション化されます。Oracle Databaseは、表パーティションにシステム生成の名前を割り当てます。

文字データ型が指定された各パーティション化キー列には、宣言された照合BINARYUSING_NLS_COMPUSING_NLS_SORTまたはUSING_NLS_SORT_CSのいずれかが必要です。

INTERVAL句を指定できない点を除いて、cluster_range_partitions句は、CREATE TABLErange_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_codecountry_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

Live SQL:

View and run a related example on Oracle Live SQL at 「Create Cluster Tables」