12.3.2 表の横分割の種類
表を横分割する方法には,次に示す2種類があります。
-
キーレンジ分割
-
ハッシュ分割(フレキシブルハッシュ分割,FIXハッシュ分割)
- 〈この項の構成〉
(1) キーレンジ分割
キーレンジ分割とは,表を構成する列のうち,特定の列が持つ値の範囲を条件として表を横分割することです。なお,表を横分割するときの条件にした特定の列を分割キーといいます。表のデータがどのRDエリアに格納されているかどうかを意識したい場合に使用します。横分割の指定方法には,次に示す2種類があります。
(b) 境界値指定
定数を使用して,それぞれのRDエリアに格納するデータの,境界となる値を指定します。一つのRDエリアに対して,境界値で区切られた複数の範囲を指定できます。なお,境界値指定の場合,マトリクス分割もできます。マトリクス分割については,「表のマトリクス分割」を参照してください。
(2) ハッシュ分割
ハッシュ分割とは,表を構成する列が持つ値をハッシュ関数を使用して,均等にRDエリアに格納し,表を横分割することです。表を横分割するときに指定した特定の列を分割キーといいます。キーの範囲を意識しないで,表のデータをRDエリアに均等に格納したい場合に使用します。ハッシュ分割は,境界値指定のキーレンジ分割と組み合わせてマトリクス分割ができます。マトリクス分割については,「表のマトリクス分割」を参照してください。
ハッシュ分割にはフレキシブルハッシュ分割とFIXハッシュ分割があります。
フレキシブルハッシュ分割では,表を分割してRDエリアに格納する場合,どのRDエリアに分割されるか定まりません。このため,検索処理では,該当する表があるすべてのバックエンドサーバが対象になります。
FIXハッシュ分割では,表がどのRDエリアに分割されたかをHiRDBが認識します。このため,検索処理では,該当するデータがあると予測されるバックエンドサーバだけが対象になります。
(a) 分割キーの選択方法
分割キーには次に示すようなキーを指定してください。
-
キー値の偏りが少ない
-
キーの値に重複が少ない
また,ハッシュ分割では,分割キーに単一列と複数列が選択できます。単一列を指定した場合,分割列のキー値の種類が少なかったり,キー値に偏りがあるとデータを均等に分割できないことがあります。この場合,分割する列名を複数指定して,データをRDエリアに均等に分割させるようにします。
(b) ハッシュ関数の種類
ハッシュ分割で使用するハッシュ関数には,次のものがあります。
-
HASH0
-
HASH1
-
HASH2
-
HASH3
-
HASH4
-
HASH5
-
HASH6
-
HASHA
-
HASHB
-
HASHC
-
HASHD
-
HASHE
-
HASHF
-
HASHZ
- リバランス表でない場合,又はマトリクス分割表の第2次元にハッシュ関数を指定する場合
-
HASH0〜HASH6又はHASHZのどれかを指定してください。HASH6が最も均等にハッシングされるので,通常はHASH6を指定してください。ただし,分割キーのデータによっては均等にならない場合もあるので,そのときにはほかのハッシュ関数を指定してください。
- リバランス表の場合
-
HASHA〜HASHFのどれかを指定してください。HASHFが最も均等にハッシングされるので,通常はHASHFを指定してください。ただし,分割キーのデータによっては均等にならない場合もあるので,そのときにはほかのハッシュ関数を指定してください。
各ハッシュ関数の詳細については,マニュアル「HiRDB Version 9 SQLリファレンス」の「CREATE TABLE(表定義)」の「オペランド」のハッシュ関数名の説明を参照してください。
(c) ハッシュ関数の選択方法
- 実際にデータベースにデータを格納して選択する方法
-
この場合のハッシュ関数の選択手順を次に示します。
-
分割キーに対応して有効なハッシュ関数を指定します。
-
データベース状態解析ユティリティ(pddbst)でRDエリアごとに格納されている行数を確認します。
-
RDエリアごとに格納している行数に偏りがある場合には,ハッシュ関数を変更し,RDエリアごとの格納行数が均等になるようにします。
-
3.の方法で格納行数が均等にならない場合は,格納行数の少ないRDエリアを重複して指定することで,格納行数が均等になるようにします。この場合の例を次の図に示します。
図12‒4 ハッシュ分割で表格納用RDエリアを重複指定する例
-
- 表分割ハッシュ関数を使用したUAPを作成し,ハッシュ関数を選択する方法
-
この場合のハッシュ関数の選択手順を次に示します。
-
HiRDBからライブラリとして提供されている,表分割ハッシュ関数(分割キーのデータ値を入力すると分割条件指定順序を出力する関数)を使用して,RDエリアごとのデータ件数の偏りを求めるUAPを作成します。
-
ハッシュ関数ごとに,表分割ハッシュ関数が出力する分割条件指定順序ごとの件数を求め,最も偏りが少ないハッシュ関数を選択します。
-
表分割ハッシュ関数を使用したUAPの作成方法については,マニュアル「HiRDB Version 9 UAP開発ガイド」を参照してください。
(d) ハッシュ関数が使用されるタイミング
ハッシュ関数は次に示すときに使用されます。
-
表単位のデータロード時
-
データの追加時
-
表単位のデータのリロード時
(3) キーレンジ分割,フレキシブルハッシュ分割及びFIXハッシュ分割の相違点
キーレンジ分割,フレキシブルハッシュ分割及びFIXハッシュ分割の相違点を次の表に示します。
相違点 |
キーレンジ分割 |
フレキシブル ハッシュ分割 |
FIXハッシュ分割 |
---|---|---|---|
データベース設計 |
キーレンジを考慮して,データベースを設計する必要があります。 |
キーレンジを考慮しないでデータベースを設計できます。 |
キーレンジを考慮しないでデータベースを設計できます。 |
検索 |
検索条件によって,該当データが存在する可能性のあるバックエンドサーバだけ検索します。※1 |
対象表のある全バックエンドサーバで検索します。 |
分割列に対して次に示す探索条件を指定した場合に,該当データが存在する可能性のあるRDエリアだけ検索します。※1 ハッシュ関数にHASH1〜HASH6,HASHA〜HASHFを指定した場合
ハッシュ関数にHASH0,HASHZを指定した場合
|
データ増加時の 対応 |
キーが増加するデータの場合,データの格納が特定のRDエリアに偏ります。 |
データが増加しても,常に均等にRDエリアに格納されます。 |
データが増加しても,常に均等にRDエリアに格納されます。 |
RDエリア閉塞時の運用 |
閉塞しているRDエリアをアクセスしない検索条件であればSQLを実行できます。※2 |
検索する表が格納されているRDエリアを一つでも閉塞すると,検索条件にかかわらずSQLを実行できません。 |
閉塞しているRDエリアをアクセスしない検索条件であればSQLを実行できます。※2 |
表の分割数の変更 |
表の再作成及び表の再編成が必要です。 |
ALTER TABLEでRDエリアを追加でき,表の再編成は必須ではありません。 |
表の再作成及び表の再編成が必要です。ただし,表にデータが入っていないときだけALTER TABLEでRDエリアを追加できます。 |
RDエリア単位のデータロード・リロード |
該当するRDエリアに格納するデータかどうかをチェックします。 |
該当するRDエリアに格納するデータかどうかをチェックしません。 |
該当するRDエリアに格納するデータかどうかをチェックします。 |
データロード時のRDエリア単位による入力データファイルの作成方法 |
キーレンジを考慮して,入力データをRDエリアごとに分類します。 |
RDエリアごとのデータ件数が均等になるように,任意の方法で分類します。 |
表分割ハッシュ関数※3を使用したアプリケーションを作成し,入力データをRDエリアごとに分類します。 |
分割キーの更新 |
同値更新だけできます。 |
更新できます。 |
同値更新だけできます。 |
クラスタキーのUNIQUE定義及びUNIQUE指定のインデクス定義 |
UNIQUEを指定できます。 |
UNIQUEを指定できません。 |
UNIQUEを指定できます。 |
ALTER TABLEによる分割格納条件の変更 |
次の分割方法の場合に変更できます。
|
変更できません。ただし,ALTER TABLEでRDエリアの追加はできます。 |
変更できません。ただし,ALTER TABLEでRDエリアの追加はできます。 |
- 注※1
-
ASSIGN LIST文の場合,検索条件に該当しないバックエンドサーバにも負荷が掛かります。
- 注※2
-
ASSIGN LIST文の場合,表全体が閉塞扱いになります。
- 注※3
-
表分割ハッシュ関数を使用したUAPの作成方法については,マニュアル「HiRDB Version 9 UAP開発ガイド」を参照してください。
(4) 表の横分割定義時の指定規則
表の横分割定義時の指定規則を次に示します。
-
キーレンジ分割の場合
-
指定できる分割キー※1は1個です。分割キーの更新はできません。
-
格納条件指定※2の場合,同じRDエリアを複数指定できません。境界値指定※3の場合,同じRDエリアを複数指定できますが,連続して同じRDエリアを指定することはできません。
-
-
ハッシュ分割の場合
-
指定できる分割キー※1は最大16個です。ただし,同じ分割キーを重複して指定することはできません。フレキシブルハッシュ分割は,分割キーの更新ができますが,FIXハッシュ分割は分割キーの更新はできません。
-
- 注※1
-
次のデータ型の列及び繰返し列は,分割キーに指定できません。
-
定義長が256バイト以上のCHAR,VARCHAR,MCHAR,MVARCHAR型
-
定義長が28文字以上のNCHAR,NVARCHAR型
-
BLOB型
-
BINARY型
-
抽象データ型
-
既定値にCURRENT_TIMESTAMP USING BESを指定したTIMESTAMP型
-
- 注※2
-
格納条件を複数指定した場合,格納条件の指定順に条件を評価し,最初に真となった格納条件に指定したRDエリアに格納します。すべての条件で真とならない場合,格納条件を指定していないRDエリアに格納します。ただし,格納条件を指定していないRDエリアがない場合,どのRDエリアにも格納されません。また,条件を評価した結果,行が1行も格納されないRDエリアがある指定の表定義はできません。
- 注※3
-
境界値には定数を指定します。ただし,長さが0の文字列定数は指定できません。境界値を複数指定する場合,昇順となるように指定してください。また,境界値を指定しないRDエリアを最後に必ず指定してください。
(5) キーレンジ分割(格納条件指定)の例
キーレンジ分割(格納条件指定)の例を次の図に示します。
- 〔説明〕
-
ZAIKO表の商品コード列(SCODE)の範囲(100L〜399Sと400L〜699S)を条件として,複数のユーザ用RDエリア(USR01とUSR02)に横分割します。