TOP > 索引構成表とクラスタの管理

索引構成表とクラスタの管理


  1. はじめに
  2. 索引構成表
  3. クラスタ


はじめに

索引構成表やクラスタは、索引のように、データベース検索のパフォーマンスを向上させるためにOracleから提供されている機能である。
索引構成表やクラスタを使用すれば、行の格納方法を制御できる。


索引構成表

索引構成表とは

索引構成表は索引ではなく、B*Tree構造に基づいてデータが格納された「」である。

  1. データは表の主キーに基づいてソートされている。(通常の表では挿入した順)
  2. ROWIDは持たない。
  3. ROWIDの代わりに、非キー列がリーフエントリに格納されている。

そのため、表とは別に索引用の領域を必要としないため、必要なディスクスペースが減るという利点がある。
また、主キーでソートされているため、主キーによる操作は高速に行なうことができる。

●通常の表と索引構成表の比較
通常の表 索引構成表
ROWIDで行を一意に識別する 主キーで行を一意に識別する
ROWIDを持つ ROWIDを持たない
2次索引(主キー以外の索引)を持つことができる 2次索引を持つことができない(ROWIDを持たないため)
全表走査を行なった場合、ROWIDの順序で行が戻される 全表走査を行なった場合、主キー順で行が戻される
一意制約を宣言することができる 一意制約以外の制約しか宣言できない
分散トランザクション、レプリケーション、パーティション化をサポートしている 分散トランザクション、レプリケーション、パーティション化をサポートしていない

索引構成表の作成

索引構成表は、CREATE TABLE文にORGANIZATION INDEX句を指定して作成する。
主キーは必ず指定する必要がある。

CREATE TABLE [スキーマ名.]索引構成表名
(列 データ型[, 列 データ型...])
ORGANIZATION INDEX

[TABLESPACE 表領域名]

[PCTFREE 空き領域割合]
[INITRANS トランザクションスロット初期数]
[MAXTRANS トランザクションスロット最大数]

[STORAGE (

[INITIAL 初期エクステントサイズ [K | M] ]
[NEXT 増分エクステントサイズ [K | M] ]
[MINEXTENTS 作成時エクステント数]
[MAXEXTENTS {最大エクステント数 | UNLIMITED}
[PCTINCREASE エクステントサイズ拡大率 ])

[PCTTHRESHOLD 領域の割合

[INCLUDING 列 ] ]

[OVERFLOW セグメント格納方法など]

]:

(pk_deptが主キー)

CREATE TABLE DEPT

(DEPTNO NUMBER(2),
NAME CHAR(20),
LOC VARCHER2(50),
MANAGER_NAME VARCHAR2(50),
CONSTRAINT pk_dept PRIMARY KEY (DEPTNO) )

ORGANIZATION INDEX
TABLESPACE USR2
PCTTHRESHOLD 20
OVERFLOW TABLESPACE USR3;


クラスタ

クラスタとは

関連する列に基づいて、2つ以上の表を結合して、一つのデータブロックに格納したものである。

  1. データは特定の列の値(クラスタキー)に基づいて、複数の表が分類結合されて同じデータブロックに格納されている。(通常の表では挿入した順)
  2. ランダムアクセスは高速になるが、全表走査は遅くなる傾向がある。
  3. クラスタキー列を更新すると、その行が別の場所に再配置されるため、更新パフォーマンスは悪くなる。
  4. クラスタキーは、1つ以上の列を指定することができる。
  5. クラスタに格納する全ての表にクラスタキーに対応する列が必要。
  6. クラスタ内の表に、クラスタキー以外の列を主キーとして設定することは可能。

●索引クラスタとハッシュクラスタ
データの分類の仕方によって、クラスタは索引クラスタとハッシュクラスタに分類される。

索引クラスタ

ハッシュクラスタ

複数の表から共通のクラスタキーの列値をもった行がまとめられて、一つの領域(クラスタブロック)に格納する。 ハッシュ関数にクラスタキーの列値を渡し、その値にしたがって複数の表を分類して、クラスタブロックに格納する。
結合処理で同時に使用されることの多い複数の表を、WHERE句によく指定される列を クラスタキーにしてクラスタ化すればパフォーマンスが向上する。 検索時にクラスタキーの列値にハッシュ関数を適用し、データの格納場所をすぐに見つけられるため、 大量データの中から1件のデータを検索するような処理でパフォーマンスが向上する。

クラスタの作成

クラスタは、CREATE CLUSTER文でクラスタを定義したあと、CREATE TABLE文にCLUSTER句を指定して表をクラスタ内に格納する。

●クラスタを定義し、複数の表を索引クラスタ内に格納する例
CREATE CLUSTER CL_EMP (deptno number(2))
SIZE 2048
TABLESPACE USR2
STORAGE (INITILAL 100M NEXT 100K PCTINCREASE 0);

CREATE TABLE DEPT (deptno number(2), dname verchar2(12), loc varchar2(12))
CLUSTER CL_EMP(deptno);

CREATE TABLE EMP (empno number(4) not NULL, ename char(10), job char(9)
, hiredate date, sal number(7,2), deptno number(2))
CLUSTER CL_EMP(deptno);

CREATE INDEX CL_EMP_IX ON CLUSTER CL_EMP; <--最後にクラスタ索引を作成

※索引クラスタの場合、クラスタ索引を作成しないとデータの挿入を含む全てのアクセスができないため、最後にCREATE INDEX文を使って索引を設定する必要がある。

※SIZE句で指定するクラスタブロックサイズは、各クラスタキーに属するデータ量の平均値を見積もって決定する。SIZE句で指定できる最大値およびデフォルト値は、ブロックサイズ。

●ハッシュクラスタの作成
CREATE CLUSTER HASH_EMP (empno number(4))
SIZE 1024
HASHKEY 3000
TABLESPACE USR2
STORAGE (INITILAL 100M NEXT 100K PCTINCREASE 0);

CREATE TABLE EMP (empno number(4) not NULL, ename char(10), job char(9)
, hiredate date, sal number(7,2), deptno number(2))
CLUSTER HASH_EMP(empno);

※ハッシュクラスタの場合、HASHKEY句を使ってハッシュキーの数を指定する。このとき、一つのキーに対応する行数を決定し、その行数×行サイズによってクラスタブロックサイズを決定する必要がある。


TOP > 索引構成表とクラスタの管理
2001/08/24 担当:K.Y