ヘッダーをスキップ
Oracle® Database管理者ガイド
11gリリース2 (11.2)
B56301-08
  目次へ移動
目次
索引へ移動
索引

前
 
次
 

22 クラスタの管理

この章の内容は、次のとおりです。

クラスタの概要

クラスタは、表データを格納するために選択可能なオプションの方法を提供します。クラスタは、同じデータ・ブロックを共有する表のグループで構成されています。表をグループ化する理由は、各表が共通の列を共有しており、一緒に使用されるケースが多いためです。たとえば、emp表とdept表がdeptno列を共有しているとします。emp表およびdept表をクラスタ化する場合(図22-1を参照)、Oracle Databaseでは、emp表およびdept表の各部門の行はすべて、物理的に同じデータ・ブロックに格納されます。

クラスタは、異なる表の関連する行を同じデータ・ブロックに格納します。そのため、クラスタを正しく使用することには、主に次のような利点があります。

  • クラスタ化表の結合によって、ディスクI/Oが減少し、アクセス時間が改善されます。

  • クラスタ・キーは、クラスタ化表が共有する列または列のグループです。最初にクラスタを作成するときに、クラスタ・キー列を指定します。その後、そのクラスタに追加する表を作成するたびに同じ列を指定します。各クラスタ・キー値は、その値が含まれている異なる表行数に関係なく、クラスタとクラスタ索引のそれぞれに1度しか格納されません。

    したがって、関連する表と索引データをクラスタに格納する方が、クラスタ化されていない表形式の場合よりも、必要となる記憶域が削減される場合があります。たとえば、図22-1では、emp表とdept表の両方にある同じ値を含んでいる多数の行に対して、各クラスタ・キー(各deptno)が1回しか格納されていないことに注意してください。

クラスタを作成した後、クラスタ内に表を作成できます。ただし、クラスタ化表に行を挿入する前に、クラスタ索引を作成しておく必要があります。クラスタを使用しても、クラスタ化表での索引の追加作成に影響はなく、通常どおり作成および削除できます。

別々にアクセスされることの多い表には、クラスタを使用しないでください。

図22-1 クラスタ化表データ

図22-1の説明が続きます
「図22-1 クラスタ化表データ」の説明


関連項目:


クラスタを管理するためのガイドライン

次の項では、クラスタを管理する際に考慮すべきガイドラインについて説明します。この項の内容は、次のとおりです。

クラスタに適した表の選択

次のような条件が成り立つ場合は、表にクラスタを使用します。

  • 表が主に問合せに使用される場合、つまり、主に挿入または更新に使用されない場合。

  • 複数の表のレコードを頻繁に問い合せたり、結合する場合。

クラスタ・キーに適した列の選択

クラスタ・キー列の選択には注意が必要です。表を結合する問合せで複数列を使用する場合、クラスタ・キーはコンポジット・キーにします。一般に、適切なクラスタ索引を表す特性は、適切な索引を表す特性と同じです。適切な索引を表す特性の詳細は、「索引を管理するためのガイドライン」を参照してください。

適切なクラスタ・キーの条件は、1つのキー値に対応している行のグループで1つのデータ・ブロックがほぼ一杯になるような、一意の値を持つことです。クラスタ・キー値ごとの行が少なすぎると、領域を浪費し、結果的にパフォーマンスが低下します。共通の値を共有する行がわずかしかないクラスタ・キーは、クラスタを作成するときにSIZEに小さい値を指定しないかぎり、ブロック内の領域を浪費する可能性があります(「平均クラスタ・キーとその対応行が必要とする領域の指定」を参照してください)。

クラスタ・キー値ごとの行が多すぎると、そのキーを持つ行を見つけるために余分な検索が起こる可能性があります。クラスタ・キーの値があまりにも一般的な場合(たとえば、malefemaleといった性別など)は、過度の検索が発生し、クラスタ化していない場合よりパフォーマンスが低下するおそれがあります。

クラスタ索引は一意にできません。また、LONG型として定義されている列を含むことはできません。

平均クラスタ・キーとその対応行が必要とする領域の指定

CREATE CLUSTER文には、平均クラスタ・キーとその対応行が必要とするバイト数の見積りであるオプション句SIZEがあります。SIZEパラメータは、次のタスクを実行する際にデータベースによって使用されます。

  • クラスタ化したデータ・ブロック内に収めることのできるクラスタ・キー(および対応する行)の数を見積る場合。

  • クラスタ化したデータ・ブロックに配置するクラスタ・キーの数を制限する場合。これにより、クラスタ内のキーの格納効率が最大になります。

SIZEは、クラスタ・キーが使用できる領域を制限しません。たとえば、2つのクラスタ・キーが1つのデータ・ブロックに収まるようにSIZEが設定された場合、どちらのクラスタ・キーでも、その利用可能なデータ・ブロック領域をいくらでも使用できます。

デフォルトでは、データベースは1つのクラスタ・キーとそれに対応する行をそのクラスタのデータ・セグメントの1データ・ブロックに格納します。ブロック・サイズはオペレーティング・システムによって異なることがありますが、クラスタ化表が異なるシステム上にある他のデータベースにインポートされるときにも、ブロック当たり1つのキーというルールは守られます。

クラスタ・キー値に対応するすべての行を1つのブロック内に収めることができない場合は、ブロックをまとめて連鎖することにより、特定のキーを持つすべての値へのアクセスの高速化が図られます。クラスタ索引は、クラスタ・キー値と対応する行をそれぞれに含むブロックの連鎖の始点を示します。複数のキーが1つのブロックに収まるようなクラスタのSIZEである場合、ブロックは複数の連鎖に所属することがあります。

各クラスタとクラスタ索引の行の位置の指定

適切な権限と表領域割当て制限を持つユーザーであれば、現在オンライン状態の表領域内に新しいクラスタおよび関連するクラスタ索引を作成できます。新しいクラスタまたは索引を格納する表領域を識別するには、CREATE CLUSTER/INDEX文に必ずTABLESPACE句を指定します。

クラスタとそのクラスタ索引は、異なる表領域内に作成できます。実際、クラスタとその索引を、それぞれ異なる記憶デバイス上に格納された異なる表領域内に作成すると、ディスク競合を最小限に抑えて、表データと索引データを同時に検索できます。

クラスタ・サイズの見積りと記憶域パラメータの設定

クラスタを作成する前にクラスタ・サイズを見積る利点は、次のとおりです。

  • クラスタの見積りサイズの合計と、索引およびREDOログ・ファイルの見積りを使用して、作成するデータベースを格納するために必要なディスク容量を決定できます。この見積りを利用して適切なハードウェアを購入できます。

  • 個々のクラスタの見積りサイズを使用することで、クラスタが使用するディスク領域をより適切に管理できます。クラスタを作成するときに、適切な記憶域パラメータを設定し、そのクラスタを使用するアプリケーションのI/Oパフォーマンスを改善できます。

表をクラスタに配置する個別のCREATE文またはALTER文ではなく、CREATE CLUSTER句またはALTER CLUSTER文のSTORAGE句を使用してクラスタのデータ・セグメントの記憶域パラメータを設定します。クラスタ化された表の作成時または変更時に指定した記憶域パラメータは無視されます。クラスタに設定された記憶域パラメータは、表の記憶域パラメータを上書きします。

クラスタの作成

自分のスキーマにクラスタを作成するには、CREATE CLUSTERシステム権限とそのクラスタを格納する表領域に対する割当て制限を持っているか、またはUNLIMITED TABLESPACEシステム権限を持っている必要があります。

別のユーザーのスキーマにクラスタを作成するには、CREATE ANY CLUSTERシステム権限が必要です。さらに、所有者はそのクラスタを格納する表領域に対する割当て制限を持っているか、またはUNLIMITED TABLESPACEシステム権限を持っている必要があります。

クラスタを作成するには、CREATE CLUSTER文を使用します。次の文は、deptno列によってクラスタ化された、emp表とdept表を格納するクラスタemp_deptを作成します。

CREATE CLUSTER emp_dept (deptno NUMBER(3))
   SIZE 600
   TABLESPACE users
   STORAGE (INITIAL 200K
      NEXT 300K
      MINEXTENTS 2
      PCTINCREASE 33);

この例のようにINDEXキーワードを指定しない場合は、デフォルトで索引クラスタが作成されます。また、ハッシュ・パラメータ(HASHKEYSHASH ISまたはSINGLE TABLE HASHKEYS)を指定すると、ハッシュ・クラスタを作成できます。ハッシュ・クラスタについては、第23章「ハッシュ・クラスタの管理」を参照してください。

クラスタ化表の作成

クラスタに表を作成するには、CREATE TABLEシステム権限またはCREATE ANY TABLEシステム権限のどちらかが必要です。なお、クラスタ内に表を作成するために、表領域割当て制限またはUNLIMITED TABLESPACEシステム権限は必要ありません。

クラスタに表を作成するには、CLUSTER句を指定したCREATE TABLE文を使用します。次の文を使用すると、emp_deptクラスタ内にemp表とdept表を作成できます。

CREATE TABLE emp (
   empno NUMBER(5) PRIMARY KEY,
   ename VARCHAR2(15) NOT NULL,
   . . .
   deptno NUMBER(3) REFERENCES dept)
   CLUSTER emp_dept (deptno);  

CREATE TABLE dept (
   deptno NUMBER(3) PRIMARY KEY, . . . )
   CLUSTER emp_dept (deptno);

注意:

クラスタ化表のスキーマは、CREATE TABLE文で指定できます。クラスタ化表は、そのクラスタを含むスキーマとは異なるスキーマに配置できます。また、列名は一致しなくてもかまいませんが、その構造は同じである必要があります。


関連項目:

クラスタ表を作成するCREATE TABLE文の構文は、『Oracle Database SQL言語リファレンス』を参照してください。

クラスタ索引の作成

クラスタ索引を作成するには、次の条件のいずれかが成り立つ必要があります。

  • スキーマにクラスタが含まれている。

  • CREATE ANY INDEXシステム権限を持っている。

どちらの場合も、クラスタ索引を格納する表領域に対する割当て制限またはUNLIMITED TABLESPACEシステム権限が必要です。

クラスタ索引は、クラスタ化表に行を挿入する前に作成する必要があります。次の文は、emp_deptクラスタに対するクラスタ索引を作成します。

CREATE INDEX emp_dept_index
   ON CLUSTER emp_dept
   TABLESPACE users
   STORAGE (INITIAL 50K
      NEXT 50K
      MINEXTENTS 2
      MAXEXTENTS 10
      PCTINCREASE 33);

クラスタ索引句(ON CLUSTER)では、クラスタ索引を作成するクラスタemp_deptを識別します。この文では、クラスタとクラスタ索引の記憶域設定も明示的に指定しています。


関連項目:

クラスタ索引を作成するCREATE INDEX文の構文は、『Oracle Database SQL言語リファレンス』を参照してください。

クラスタの変更

クラスタを変更するには、そのクラスタが自分のスキーマに含まれているか、またはALTER ANY CLUSTERシステム権限を持っている必要があります。既存のクラスタを変更することにより、次の設定を変更できます。

  • 物理属性(INITRANSおよび記憶域特性)

  • クラスタ・キー値のすべての行を格納するために必要な平均使用可能空き領域(SIZE)

  • デフォルトの並列度

また、クラスタに新しいエクステントを明示的に割り当てたり、クラスタの最後にある未使用のエクステントの割当てを解除できます。データベースは、必要に応じてクラスタのデータ・セグメントに追加のエクステントを動的に割り当てます。ただし、状況によっては、クラスタに追加のエクステントを明示的に割り当てることもできます。たとえば、Real Application Clustersを使用している場合、クラスタのエクステントを特定のインスタンスに明示的に割り当てることができます。クラスタに新しいエクステントを割り当てるには、ALLOCATE EXTENT句を指定したALTER CLUSTER文を使用します。

クラスタ・サイズ・パラメータ(SIZE)を変更すると、そのクラスタにすでに割り当てられているブロックと今後割り当てられるブロックを含め、そのクラスタが使用するすべてのデータ・ブロックに対して新しい設定が適用されます。すでに表に割り当てられているブロックは、即時ではなく、必要なときに再編成されます。

クラスタのトランザクション・エントリ設定INITRANSを変更すると、INITRANSの新しい設定は、その後クラスタに割り当てられるブロックにのみ適用されます。

記憶域パラメータINITIALMINEXTENTSは変更できません。他の記憶域パラメータの新しい設定はすべて、その後にクラスタに割り当てられるエクステントにのみ影響します。

クラスタを変更するには、ALTER CLUSTER文を使用します。


関連項目:

ALTER CLUSTER文の構文は、『Oracle Database SQL言語リファレンス』を参照してください。

クラスタ化表の変更

クラスタ化表はALTER TABLE文を使用して変更できます。ただし、ALTER TABLE文でクラスタ化表に対してデータ・ブロック領域パラメータ、トランザクション・エントリ・パラメータまたは記憶域パラメータを設定すると、エラー・メッセージ(ORA-01771、クラスタ表に対するオプションが無効です。)が生成されます。データベースは、クラスタのパラメータをすべてのクラスタ化表に対して使用します。そのため、ALTER TABLE文は、クラスタ化表の列の追加または変更、クラスタ・キー以外の列の削除、整合性制約またはトリガーの追加、削除、有効化、無効化のみに使用できます。表の変更の詳細は、「表の変更」を参照してください。


関連項目:

ALTER TABLE文の構文は、『Oracle Database SQL言語リファレンス』を参照してください。

クラスタ索引の変更

クラスタ索引は、他の索引と同じように変更できます。「索引の変更」を参照してください。


注意:

クラスタ索引のサイズを見積るときには、索引が実際の行ではなく各クラスタ・キーに付いていることに注意してください。したがって、各キーは索引内に1度しか現れません。

クラスタの削除

クラスタ内の表が不要になった場合は、そのクラスタを削除できます。クラスタを削除すると、そのクラスタ内の表および対応するクラスタ索引も削除されます。クラスタのデータ・セグメントとクラスタ索引の索引セグメントの両方に属するすべてのエクステントは、それらを含んでいる表領域に戻され、その表領域内の他のセグメントで使用可能になります。

表を含まないクラスタとそのクラスタ索引を削除するには、DROP CLUSTER文を使用します。たとえば、次の文は空のクラスタemp_deptを削除します。

DROP CLUSTER emp_dept;

クラスタに1つ以上のクラスタ化表が含まれており、その表も同様に削除する場合は、次のように、DROP CLUSTER文にINCLUDING TABLES句を追加します。

DROP CLUSTER emp_dept INCLUDING TABLES;

INCLUDING TABLES句を指定していない場合に、クラスタに表が含まれていると、エラーが返されます。

クラスタ内の1つ以上の表が、クラスタ外の表のFOREIGN KEY制約によって参照される主キーまたは一意のキーを含んでいる場合、依存するFOREIGN KEY制約も削除しないと、そのクラスタを削除できません。これは、次の例に示すように、DROP CLUSTER文のCASCADE CONSTRAINTS句を使用すると容易に実行できます。

DROP CLUSTER emp_dept INCLUDING TABLES CASCADE CONSTRAINTS;

制約が存在している場合に、CASCADE CONSTRAINTS句を使用しないと、データベースはエラーを返します。


関連項目:

DROP CLUSTER文の構文は、『Oracle Database SQL言語リファレンス』を参照してください。

クラスタ化表の削除

クラスタを削除するには、そのクラスタが自分のスキーマに含まれているか、またはDROP ANY CLUSTERシステム権限を持っている必要があります。クラスタ化表をそのクラスタの所有者が所有していなくても、その表を含むクラスタを削除するために特別な権限は必要ありません。

クラスタ化表は、そのクラスタ、他のクラスタ化表またはクラスタ索引に影響を及ぼすことなく、個別に削除できます。クラスタ化表は、非クラスタ化表を削除する場合と同じように、DROP TABLE文を使用して削除します。「表の列の削除」を参照してください。


注意:

単一の表をクラスタから削除するときは、表の各行が個別に削除されます。クラスタ全体を最も効率よく削除するには、INCLUDING TABLES句を指定したDROP CLUSTER文を使用して、そのクラスタを表も含めて削除します。クラスタの残りの部分をそのままにしておく場合のみ、(DROP TABLE文を使用して)クラスタから表を個別に削除してください。

クラスタ索引の削除

クラスタ索引は、そのクラスタまたはクラスタ化表に影響を及ぼすことなく削除できます。ただし、クラスタ索引がなければクラスタ化表は使用できないため、クラスタへのアクセスを許可するにはクラスタ索引を再作成する必要があります。クラスタ索引は、断片化したクラスタ索引を再作成する過程で削除される場合があります。


注意:

ハッシュ・クラスタ索引は削除できません。


関連項目:

「索引の削除」

クラスタのデータ・ディクショナリ・ビュー

次のビューには、クラスタに関する情報が表示されます。

ビュー 説明
DBA_CLUSTERS

ALL_CLUSTERS

USER_CLUSTERS

DBAビューには、データベース内のすべてのクラスタが表示されます。ALLビューには、ユーザーがアクセス可能なすべてのクラスタが表示されます。USERビューは、ユーザーが所有するクラスタのみに制限されます。これらのビューの一部の列には、DBMS_STATSパッケージまたはANALYZE文によって生成される統計が含まれます。
DBA_CLU_COLUMNS

USER_CLU_COLUMNS

これらのビューでは、表の列とクラスタの列がマップされています。


関連項目:

これらのビューの完全な説明は、『Oracle Databaseリファレンス』を参照してください。