Oracle Database 管理者ガイド 11gリリース1(11.1) E05760-03 |
|
この章の内容は次のとおりです。
クラスタは、表データを格納するために選択可能なオプションの方法を提供します。クラスタは、同じデータ・ブロックを共有する表のグループで構成されています。表をグループ化する理由は、各表が共通の列を共有しており、一緒に使用されるケースが多いためです。たとえば、emp
表とdept
表がdeptno
列を共有しているとします。emp
表およびdept
表をクラスタ化する場合(図20-1を参照)、Oracle Databaseでは、emp
表およびdept
表の各部門の行はすべて、物理的に同じデータ・ブロックに格納されます。
クラスタは、異なる表の関連する行を同じデータ・ブロックに格納します。そのため、クラスタを正しく使用することには、主に次のような利点があります。
そのため、関連する表および索引データをクラスタに格納するために必要な記憶域は、非クラスタ化表形式の場合に比べて少なくて済みます。図20-1に、クラスタ・キーの格納方法を示します。各クラスタ・キー(各deptno
)は、emp
表とdept
表の両方に同じ値が含まれている多数の行について1度しか格納されていません。
クラスタを作成した後、そのクラスタ内に表を作成できます。ただし、クラスタ化表に行を挿入する前に、クラスタ索引を作成する必要があります。クラスタを使用しても、クラスタ化表に対して索引を追加することには影響しません。索引は通常どおり作成および削除できます。
別々にアクセスされることの多い表には、クラスタを使用しないでください。
関連項目:
|
次の項では、クラスタを管理する際に考慮すべきガイドラインについて説明します。この項の内容は、次のとおりです。
次のような条件が成り立つ場合は、表にクラスタを使用します。
クラスタ・キー列の選択には注意が必要です。表を結合する問合せで複数列を使用する場合、クラスタ・キーはコンポジット・キーにします。一般に、適切なクラスタ索引を表す特性は、適切な索引を表す特性と同じです。適切な索引を表す特性の詳細は、「索引を管理するためのガイドライン」を参照してください。
適切なクラスタ・キーの条件は、1つのキー値に対応している行のグループで1つのデータ・ブロックがほぼいっぱいになるような、一意の値を持つことです。クラスタ・キー値ごとの行が少なすぎると、領域を浪費し、結果的にパフォーマンスが低下します。共通の値を共有する行がわずかしかないクラスタ・キーは、クラスタを作成するときにSIZE
に小さい値を指定しないかぎり、ブロック内の領域を浪費する可能性があります(「平均クラスタ・キーとその対応行が必要とする領域の指定」を参照してください)。
クラスタ・キー値ごとの行が多すぎると、そのキーを持つ行を見つけるために余分な検索が起こる可能性があります。クラスタ・キーの値があまりにも一般的な場合(たとえば、male
とfemale
といった性別など)は、過度の検索が発生し、クラスタ化していない場合よりパフォーマンスが低下するおそれがあります。
クラスタ索引は一意にできません。また、LONG
型として定義されている列を含むことはできません。
CREATE CLUSTER
文にはオプションの句SIZE
があります。これは、平均クラスタ・キーとそれに対応する行で必要なバイト数の見積りです。データベースでは、次の処理を実行するときに、SIZE
パラメータが使用されます。
SIZE
は、クラスタ・キーが使用できる領域を制限しません。たとえば、2つのクラスタ・キーが1つのデータ・ブロックに収まるようにSIZE
が設定された場合、どちらのクラスタ・キーでも、その利用可能なデータ・ブロック領域をいくらでも使用できます。
デフォルトでは、データベースは1つのクラスタ・キーとそれに対応する行をそのクラスタのデータ・セグメントの1データ・ブロックに格納します。ブロック・サイズはオペレーティング・システムによって異なることがありますが、クラスタ化表が異なるマシン上にある他のデータベースにインポートされるときにも、ブロック当たり1つのキーというルールは守られます。
クラスタ・キー値に対応するすべての行を1つのブロック内に収めることができない場合は、ブロックをまとめて連鎖することにより、特定のキーを持つすべての値へのアクセスの高速化が図られます。クラスタ索引は、クラスタ・キー値と対応する行をそれぞれに含むブロックの連鎖の始点を示します。クラスタのSIZE
が、複数のキーが1つのブロックに収まる大きさに設定されている場合は、ブロックが複数の連鎖に属する可能性があります。
適切な権限と表領域割当て制限を持つユーザーであれば、現在オンライン状態の表領域内に新しいクラスタおよび関連するクラスタ索引を作成できます。新しいクラスタまたは索引を格納する表領域を識別するには、CREATE CLUSTER
/INDEX
文に必ずTABLESPACE
句を指定します。
クラスタとそのクラスタ索引は、異なる表領域内に作成できます。実際、クラスタとその索引を、それぞれ異なる記憶デバイス上に格納された異なる表領域内に作成すると、ディスク競合を最小限に抑えて、表データと索引データを同時に検索できます。
クラスタを作成する前にクラスタ・サイズを見積る利点は、次のとおりです。
クラスタのデータ・セグメントに対する記憶域パラメータは、CREATE
CLUSTER
文またはALTER
CLUSTER
文のSTORAGE
句を使用して設定します。クラスタ内に表を設定する個々のCREATE
文またはALTER
文には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
キーワードを指定しない場合は、デフォルトで索引クラスタが作成されます。また、ハッシュ・パラメータ(HASHKEYS
、HASH IS
またはSINGLE TABLE HASHKEYS
)を指定すると、ハッシュ・
クラスタを作成できます。ハッシュ・クラスタについては、第21章「ハッシュ・クラスタの管理」を参照してください。
クラスタに表を作成するには、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);
クラスタ索引を作成するには、次の条件のいずれかが成り立つ必要があります。
どちらの場合も、クラスタ索引を格納する表領域に対する割当て制限または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
を識別します。この文では、クラスタとクラスタ索引の記憶域設定も明示的に指定しています。
クラスタを変更するには、そのクラスタが自分のスキーマに含まれているか、またはALTER ANY CLUSTER
システム権限を持っている必要があります。既存のクラスタを変更することにより、次の設定を変更できます。
また、クラスタに新しいエクステントを明示的に割り当てたり、クラスタの最後にある未使用のエクステントの割当てを解除できます。データベースは、必要に応じてクラスタのデータ・セグメントに追加のエクステントを動的に割り当てます。ただし、状況によっては、クラスタに追加のエクステントを明示的に割り当てることもできます。たとえば、Real Application Clustersを使用している場合、クラスタのエクステントを特定のインスタンスに明示的に割り当てることができます。クラスタに新しいエクステントを割り当てるには、ALLOCATE EXTENT
句を指定したALTER CLUSTER
文を使用します。
クラスタ・サイズ・パラメータ(SIZE
)を変更すると、そのクラスタにすでに割り当てられているブロックと今後割り当てられるブロックを含め、そのクラスタが使用するすべてのデータ・ブロックに対して新しい設定が適用されます。すでに表に割り当てられているブロックは、即時ではなく、必要なときに再編成されます。
クラスタのトランザクション・エントリ設定INITRANS
を変更すると、INITRANS
の新しい設定は、その後クラスタに割り当てられるブロックにのみ適用されます。
記憶域パラメータINITIAL
とMINEXTENTS
は変更できません。他の記憶域パラメータの新しい設定はすべて、その後にクラスタに割り当てられるエクステントにのみ影響します。
クラスタを変更するには、ALTER CLUSTER
文を使用します。
クラスタ化表を変更するには、ALTER TABLE
文を使用します。ただし、クラスタ化表に対してALTER TABLE
文でデータ・ブロック領域パラメータ、トランザクション・エントリ・パラメータまたは記憶域パラメータを設定しても、エラー・メッセージ(ORA-01771
「クラスタ表に対するオプションが無効です。」)が出力されます。これは、クラスタ化表では必ずそのクラスタのパラメータが使用されるためです。そのため、クラスタ化表に対してALTER TABLE
文を使用できるのは、列の追加や変更、非クラスタ化キー列の削除、整合性制約やトリガーの追加、削除、使用可能または使用禁止のみに限定されます。表の変更方法については、「表の変更」を参照してください。
クラスタ索引は、他の索引と同じように変更できます。「索引の変更」を参照してください。
クラスタ内の表が不要になった場合は、そのクラスタを削除できます。クラスタを削除すると、そのクラスタ内の表および対応するクラスタ索引も削除されます。クラスタのデータ・セグメントとクラスタ索引の索引セグメントの両方に属するすべてのエクステントは、それらを含んでいる表領域に戻され、その表領域内の他のセグメントで使用可能になります。
表を含まないクラスタとそのクラスタ索引を削除するには、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 ANY CLUSTER
システム権限を持っている必要があります。クラスタ化表をそのクラスタの所有者が所有していなくても、その表を含むクラスタを削除するために特別な権限は必要ありません。
クラスタ化表は、そのクラスタ、他のクラスタ化表またはクラスタ索引に影響を及ぼすことなく、個別に削除できます。クラスタ化表は、非クラスタ化表を削除する場合と同じように、DROP TABLE
文を使用して削除します。「表の列の削除」を参照してください。
クラスタ索引は、クラスタまたはそのクラスタ化表に影響を及ぼすことなく削除できます。ただし、クラスタ索引が存在しないと、クラスタ化表を使用できません。クラスタへのアクセスを可能にするには、クラスタ索引の再作成が必要です。断片化したクラスタ索引を再作成する手順の一部として、クラスタ索引を削除することがあります。索引を削除する方法の詳細は、「索引の削除」を参照してください。
次のビューには、クラスタに関する情報が表示されます。