クラスタを使用してパフォーマンスを改善し、必要なディスク領域を削減できます。
クラスタは、表データを格納するために選択可能なオプションの方法を提供します。クラスタは、同じデータ・ブロックを共有する表のグループで構成されています。表をグループ化する理由は、各表が共通の列を共有しており、一緒に使用されるケースが多いためです。
たとえば、emp
表とdept
表がdeptno
列を共有しているとします。emp
表およびdept
表をクラスタ化する場合(図22-1を参照)、Oracle Databaseでは、emp
表およびdept
表の各部門の行はすべて、物理的に同じデータ・ブロックに格納されます。
クラスタは、異なる表の関連する行を同じデータ・ブロックに格納します。そのため、クラスタを正しく使用することには、主に次のような利点があります。
クラスタ化表の結合によって、ディスクI/Oが減少し、アクセス時間が改善されます。
クラスタ・キーは、クラスタ化表が共有する列または列のグループです。最初にクラスタを作成するときに、クラスタ・キー列を指定します。その後、そのクラスタに追加する表を作成するたびに同じ列を指定します。各クラスタ・キー値は、その値が含まれている異なる表行数に関係なく、クラスタとクラスタ索引のそれぞれに1度しか格納されません。
したがって、関連する表と索引データをクラスタに格納する方が、クラスタ化されていない表形式の場合よりも、必要となる記憶域が削減される場合があります。たとえば、図22-1では、emp
表とdept
表の両方にある同じ値を含んでいる多数の行に対して、各クラスタ・キー(各deptno
)が1回しか格納されていないことに注意してください。
クラスタを作成した後、クラスタ内に表を作成できます。ただし、クラスタ化表に行を挿入する前に、クラスタ索引を作成しておく必要があります。クラスタを使用しても、クラスタ化表での索引の追加作成に影響はなく、通常どおり作成および削除できます。
別々にアクセスされることの多い表には、クラスタを使用しないでください。
関連項目:
もう1つのタイプのクラスタ(ハッシュ・クラスタ)の詳細は、「ハッシュ・クラスタの管理」を参照してください
この章のタスクを実行する前に、「スキーマ・オブジェクトの領域の管理」を一読されることをお薦めします
クラスタを管理するためにガイドラインに従うことができます。
関連項目:
クラスタの詳細は、『Oracle Database概要』を参照してください。
どのようなときにクラスタを使用するかについてのガイドラインは、『Oracle Database SQLチューニング・ガイド』を参照してください。
主に問合せであり、まとめて問い合されることの多い表にクラスタを使用します。
次のような条件が成り立つ場合は、表にクラスタを使用します。
表が主に問合せに使用される場合、つまり、主に挿入または更新に使用されない場合。
複数の表のレコードを頻繁に問い合せたり、結合する場合。
クラスタ・キー列の選択には注意が必要です。表を結合する問合せで複数列を使用する場合、クラスタ・キーはコンポジット・キーにします。一般に、適切なクラスタ索引を表す特性は、適切な索引を表す特性と同じです。
適切な索引を表す特性の詳細は、「索引を管理するためのガイドライン」を参照してください。
適切なクラスタ・キーの条件は、1つのキー値に対応している行のグループで1つのデータ・ブロックがほぼ一杯になるような、一意の値を持つことです。クラスタ・キー値ごとの行が少なすぎると、領域を浪費し、結果的にパフォーマンスが低下します。共通の値を共有する行がわずかしかないクラスタ・キーは、クラスタを作成するときにSIZE
に小さい値を指定しないかぎり、ブロック内の領域を浪費する可能性があります(「平均クラスタ・キーとその対応行が必要とする領域の指定」を参照してください)。
クラスタ・キー値ごとの行が多すぎると、そのキーを持つ行を見つけるために余分な検索が起こる可能性があります。クラスタ・キーの値があまりにも一般的な場合(たとえば、male
とfemale
といった性別など)は、過度の検索が発生し、クラスタ化していない場合よりパフォーマンスが低下するおそれがあります。
クラスタ索引は一意にできません。また、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
文を使用します。クラスタ表を作成するには、CLUSTER
句を指定したCREATE TABLE
文を使用します。クラスタ索引を作成するには、CLUSTER
句を指定したCREATE INDEX
文を使用します。
クラスタを作成するには、CREATE CLUSTER
文を使用します。
自分のスキーマにクラスタを作成するには、CREATE CLUSTER
システム権限とそのクラスタを格納する表領域に対する割当て制限を持っているか、またはUNLIMITED TABLESPACE
システム権限を持っている必要があります。
別のユーザーのスキーマにクラスタを作成するには、CREATE ANY CLUSTER
システム権限が必要です。さらに、所有者はそのクラスタを格納する表領域に対する割当て制限を持っているか、またはUNLIMITED TABLESPACE
システム権限を持っている必要があります。
次の文は、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
)を指定すると、ハッシュ・
クラスタを作成できます。ハッシュ・クラスタについては、「ハッシュ・クラスタの管理」を参照してください。
クラスタに表を作成するには、CLUSTER
句を指定したCREATE TABLE
文を使用します。
クラスタに表を作成するには、CREATE TABLE
システム権限またはCREATE ANY TABLE
システム権限のどちらかが必要です。なお、クラスタ内に表を作成するために、表領域割当て制限またはUNLIMITED TABLESPACE
システム権限は必要ありません。
たとえば、次の文を使用すると、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 CLUSTER
文を使用してクラスタを変更します。
クラスタを変更するには、そのクラスタが自分のスキーマに含まれているか、またはALTER ANY CLUSTER
システム権限を持っている必要があります。既存のクラスタを変更することにより、次の設定を変更できます。
物理属性(INITRANS
および記憶域特性)
クラスタ・キー値のすべての行を格納するために必要な平均使用可能空き領域(SIZE
)
デフォルトの並列度
また、クラスタに新しいエクステントを明示的に割り当てたり、クラスタの最後にある未使用のエクステントの割当てを解除できます。データベースは、必要に応じてクラスタのデータ・セグメントに追加のエクステントを動的に割り当てます。ただし、状況によっては、クラスタに追加のエクステントを明示的に割り当てることもできます。たとえば、Real Application Clustersを使用している場合、クラスタのエクステントを特定のインスタンスに明示的に割り当てることができます。クラスタに新しいエクステントを割り当てるには、ALLOCATE EXTENT
句を指定したALTER CLUSTER
文を使用します。
クラスタ・サイズ・パラメータ(SIZE
)を変更すると、そのクラスタにすでに割り当てられているブロックと今後割り当てられるブロックを含め、そのクラスタが使用するすべてのデータ・ブロックに対して新しい設定が適用されます。すでに表に割り当てられているブロックは、即時ではなく、必要なときに再編成されます。
クラスタのトランザクション・エントリ設定INITRANS
を変更すると、INITRANS
の新しい設定は、その後クラスタに割り当てられるブロックにのみ適用されます。
記憶域パラメータINITIAL
とMINEXTENTS
は変更できません。他の記憶域パラメータの新しい設定はすべて、その後にクラスタに割り当てられるエクステントにのみ影響します。
クラスタを変更するには、ALTER CLUSTER
文を使用します。
関連項目:
ALTER CLUSTER
文の構文は、『Oracle Database SQL言語リファレンス』を参照してください。
ALTER TABLE
文を使用してクラスタ化表を変更できますが、クラスタ化表の一部のパラメータはALTER TABLE
文で設定できません。
ただし、ALTER TABLE
文でクラスタ化表に対してデータ・ブロック領域パラメータ、トランザクション・エントリ・パラメータまたは記憶域パラメータを設定すると、エラー・メッセージ(ORA-01771、クラスタ表に対するオプションが無効です。
)が生成されます。データベースは、クラスタのパラメータをすべてのクラスタ化表に対して使用します。そのため、ALTER TABLE
文は、クラスタ化表の列の追加または変更、クラスタ・キー以外の列の削除、整合性制約またはトリガーの追加、削除、有効化、無効化のみに使用できます。表の変更の詳細は、「表の変更」を参照してください。
関連項目:
ALTER TABLE
文の構文は、『Oracle Database SQL言語リファレンス』を参照してください。
クラスタ索引は、他の索引と同じように変更できます。
「索引の変更」を参照してください。
注意:
クラスタ索引のサイズを見積るときには、索引が実際の行ではなく各クラスタ・キーに付いていることに注意してください。したがって、各キーは索引内に1度しか現れません。
クラスタはDROP CLUSTER
文を使用して削除します。クラスタ表はDROP TABLE
文を使用して削除します。クラスタ索引はDROP INDEX
文を使用して削除します。
クラスタはDROP CLUSTER
文を使用して削除できます。
クラスタ内の表が不要になった場合は、そのクラスタを削除できます。クラスタを削除すると、そのクラスタ内の表および対応するクラスタ索引も削除されます。クラスタのデータ・セグメントとクラスタ索引の索引セグメントの両方に属するすべてのエクステントは、それらを含んでいる表領域に戻され、その表領域内の他のセグメントで使用可能になります。
表を含まないクラスタとそのクラスタ索引を削除するには、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 TABLE
文を使用して削除します。
クラスタを削除するには、そのクラスタが自分のスキーマに含まれているか、またはDROP ANY CLUSTER
システム権限を持っている必要があります。クラスタ化表をそのクラスタの所有者が所有していなくても、その表を含むクラスタを削除するために特別な権限は必要ありません。
「表の列の削除」を参照してください。
注意:
単一の表をクラスタから削除するときは、表の各行が個別に削除されます。クラスタ全体を最も効率よく削除するには、INCLUDING TABLES
句を指定したDROP CLUSTER
文を使用して、そのクラスタを表も含めて削除します。クラスタの残りの部分をそのままにしておく場合のみ、(DROP TABLE
文を使用して)クラスタから表を個別に削除してください。
データ・ディクショナリ・ビューのセットに対してクラスタに関する情報を問い合せることができます。
次のビューには、クラスタに関する情報が表示されます。
ビュー | 説明 |
---|---|
|
|
|
これらのビューでは、表の列とクラスタの列がマップされています。 |
関連項目:
これらのビューの完全な説明は、『Oracle Databaseリファレンス』を参照してください。