スケーラブルデータベースサーバ HiRDB Version 8 システム導入・設計ガイド(Windows(R)用)
横分割インデクスを設計する前に,分割キーインデクスと非分割キーインデクスについて理解する必要があります。
インデクスがある一定の条件を満たすと,そのインデクスは分割キーインデクスになり,条件を満たさないインデクスは非分割キーインデクスになります。この条件は,表が単一列分割か複数列分割かによって異なります。
- 注
- 表の分割条件に一つの列だけを使用している場合を単一列分割といい,表の分割条件に複数の列を使用している場合を複数列分割といいます。
(a) 単一列分割の場合
次に示すどちらかの条件を満たす場合,そのインデクスは分割キーインデクスになります。
- 〈条件〉
- 表を横分割するときに格納条件を指定した列(分割キー)に定義した単一列インデクス
- 表を横分割するときに格納条件を指定した列(分割キー)を第1構成列とした複数列インデクス
次に示すZAIKO表を例にして,インデクスが分割キーインデクスになる場合を次の図に示します。
図13-1 分割キーインデクスになる場合(単一列分割の場合)
- 〔説明〕
CREATE INDEX A12 ON ZAIKO (SCODE ASC) 1
CREATE INDEX A12 ON ZAIKO (SCODE ASC,TANKA DESC) 2
CREATE INDEX A12 ON ZAIKO (TANKA DESC,SCODE ASC) 3
- 分割キーであるSCODE列をインデクスとした場合,そのインデクスは分割キーインデクスになります。そのほかの列をインデクスとした場合,そのインデクスは非分割キーインデクスになります。
- 分割キーであるSCODE列を複数列インデクスの第1構成列にすると,その複数列インデクスは分割キーインデクスになります。
- 分割キーであるSCODE列を第1構成列以外に指定すると,その複数列インデクスは非分割キーインデクスになります。
(b) 複数列分割の場合
次に示す条件を満たす場合,そのインデクスは分割キーインデクスになります。
- 〈条件〉
- 分割キーを先頭とし,分割に指定した列を先頭から同順にすべて含んで,複数の列に作成したインデクス
次に示すZAIKO表を例にして,インデクスが分割キーインデクスになる場合を次の図に示します。
図13-2 分割キーインデクスになる場合(複数列分割の場合)
- 〔説明〕
CREATE INDEX A12 ON ZAIKO (SCODE ASC,TANKA DESC) 1
CREATE INDEX A12 ON ZAIKO (SCODE ASC,TANKA DESC,ZSURYO ASC) 2
CREATE INDEX A12 ON ZAIKO (TANKA DESC,SCODE ASC) 3
CREATE INDEX A12 ON ZAIKO (SCODE ASC,ZSURYO DESC,TANKA ASC) 4
- すべての分割キー(SCODE及びTANKA列)を指定し,かつ分割キーの指定順序が表定義時と同じため,この複数列インデクスは分割キーインデクスになります。
- すべての分割キー(SCODE及びTANKA列)を指定し,かつ分割キーの指定順序が表定義時と同じため,この複数列インデクスは分割キーインデクスになります。
- すべての分割キー(SCODE及びTANKA列)を指定しているが,分割キーの指定順序が表定義時と異なるため,この複数列インデクスは非分割キーインデクスになります。
- すべての分割キー(SCODE及びTANKA列)を指定しているが,分割キーの指定順序が表定義時と異なるため,この複数列インデクスは非分割キーインデクスになります。
インデクスが分割キーインデクスか非分割キーインデクスかによって,次の表に示すとおりインデクスの分割指針が異なります。
表13-5 インデクスの分割指針
インデクス
の種類 |
HiRDB/シングル
サーバの場合 |
HiRDB/パラレルサーバの場合 |
表をサーバ内
横分割する場合 |
表をサーバ間
横分割する場合 |
インデクスが分割キーインデクスの場合 |
横分割表に対応させてインデクスも横分割します。 |
横分割表に対応させてインデクスも横分割します。 |
横分割表に対応させてインデクスも横分割します。 |
インデクスが非分割キーインデクスの場合 |
インデクスを横分割しないことをお勧めします。インデクスを横分割すると,インデクスを使用した検索性能が悪くなることがあります※。 |
インデクスを横分割しないことをお勧めします。インデクスを横分割すると,インデクスを使用した検索性能が悪くなることがあります※。 |
- 注※
- 非分割キーインデクスは横分割しないことをお勧めします。インデクスを横分割すると,インデクスを使用した検索性能が悪くなることがあります。具体的には,次に示すアクセスパスを使用した検索ができなくなるため,インデクスを使用した検索性能が悪くなることがあります。
- KEY SCAN MERGE JOIN
- LIST SCAN MERGE JOIN
- L-KEY R-LIST MERGE JOIN
- L-KEY R-SORT MERGE JOIN
- L-LIST R-KEY MERGE JOIN
- L-LIST R-SORT MERGE JOIN
- L-SORT R-KEY MERGE JOIN
- L-SORT R-LIST MERGE JOIN
- これらのアクセスパスについては,マニュアル「HiRDB Version 8 コマンドリファレンス」のアクセスパス表示ユティリティ(pdvwoptコマンド)を参照してください。
- ただし,表のデータが非常に多い場合は,インデクスの横分割を検討してください。インデクスを横分割すると,表格納RDエリアとインデクス格納RDエリアが1対1で管理できるため,ユティリティの操作性が向上します。例えば,インデクスを横分割しない場合にRDエリア単位のデータロード,又はRDエリア単位の再編成をしたときは,データロード又は再編成後にインデクスを一括作成する必要があります。インデクスを横分割すれば,RDエリア単位のデータロード,又はRDエリア単位の再編成後にインデクスを一括作成する必要はありません。
- なお,マトリクス分割表にインデクスを定義する場合,非分割キーインデクスであっても分割キーと同様に横分割する必要があります。
(3) 設計上の考慮点
- 横分割表を格納するユーザ用RDエリアと,横分割表のそれぞれに対応するインデクスを格納するユーザ用RDエリアを分けます。これによって,それぞれのユーザ用RDエリアの使用効率が良くなります。
- 表の中に一意にしたいキーがあるときは,このキーにUNIQUEを指定した分割キーインデクスを定義します。又は,分割キーに対してクラスタキーを指定します。また,非分割キーインデクスの場合でも,次のどちらかであればUNIQUEを指定できます。
- 非分割インデクス
- 分割キーを任意の構成列に含む分割インデクス
ただし,フレキシブルハッシュ分割した表では,インデクスにUNIQUEを指定できません。詳細については,マニュアル「HiRDB Version8 SQLリファレンス」の「CREATE INDEX」の「表を横分割する場合のUNIQUE指定可否」を参照してください。
(4) インデクスの横分割の例(HiRDB/シングルサーバの場合)
インデクスの横分割の例(HiRDB/シングルサーバの場合)を次の図に示します。
図13-3 インデクスの横分割の例(HiRDB/シングルサーバの場合)
- 〔説明〕
- ディスクのアクセス競合を避けるために,分割した表及びインデクスを格納するRDエリアを異なるディスク上に配置してください。
- 分割キーインデクスは横分割してください。
- 性能を重視する場合は,非分割キーインデクスを横分割しないでください。
- 操作性を重視する場合は,非分割キーインデクスを横分割してください。
(5) インデクスの横分割の例(HiRDB/パラレルサーバの場合)
インデクスの横分割の例(サーバ内横分割の場合)を次の図に示します。
図13-4 インデクスの横分割の例(サーバ内横分割の場合)
- 〔説明〕
- ディスクのアクセス競合を避けるために,分割した表及びインデクスを格納するRDエリアを異なるディスク上に配置してください。
- 分割キーインデクスは横分割してください。
- 性能を重視する場合は,非分割キーインデクスを横分割しないでください。
- 操作性を重視する場合は,非分割キーインデクスを横分割してください。
インデクスの横分割の例(サーバ間横分割の場合)を次の図に示します。
図13-5 インデクスの横分割の例(サーバ間横分割の場合)
- 〔説明〕
- ディスクのアクセス競合を避けるために,分割した表及びインデクスを格納するRDエリアを異なるディスク上に配置してください。
- 分割キーインデクス及び非分割キーインデクスを横分割してください。
All Rights Reserved. Copyright (C) 2006, 2016, Hitachi, Ltd.