スケーラブルデータベースサーバ HiRDB Version 8 システム導入・設計ガイド(Windows(R)用)

[目次][索引][前へ][次へ]

12.3.2 表の横分割の種類

表を横分割する方法には,次に示す2種類があります。

<この項の構成>
(1) キーレンジ分割
(2) ハッシュ分割
(3) キーレンジ分割,フレキシブルハッシュ分割及びFIXハッシュ分割の相違点
(4) 表の横分割定義時の指定規則
(5) キーレンジ分割(格納条件指定)の例
(6) キーレンジ分割(境界値指定)の例
(7) フレキシブルハッシュ分割及びFIXハッシュ分割の例

(1) キーレンジ分割

キーレンジ分割とは,表を構成する列のうち,特定の列が持つ値の範囲を条件として表を横分割することです。なお,表を横分割するときの条件にした特定の列を分割キーといいます。表のデータがどのRDエリアに格納されているかどうかを意識したい場合に使用します。横分割の指定方法には,次に示す2種類があります。

(a) 格納条件指定

比較演算子を使用して,それぞれのRDエリアへの格納条件を指定します。一つのRDエリアに対して,格納条件で指定された一つの範囲だけを指定できます。

(b) 境界値指定

定数を使用して,それぞれのRDエリアに格納するデータの,境界となる値を指定します。一つのRDエリアに対して,境界値で区切られた複数の範囲を指定できます。なお,境界値指定の場合,マトリクス分割もできます。マトリクス分割については,「12.4 表のマトリクス分割」を参照してください。

(2) ハッシュ分割

ハッシュ分割とは,表を構成する列が持つ値をハッシュ関数を使用して,均等にRDエリアに格納し,表を横分割することです。表を横分割するときに指定した特定の列を分割キーといいます。キーの範囲を意識しないで,表のデータをRDエリアに均等に格納したい場合に使用します。ハッシュ分割は,境界値指定のキーレンジ分割と組み合わせてマトリクス分割ができます。マトリクス分割については,「12.4 表のマトリクス分割」を参照してください。

ハッシュ分割にはフレキシブルハッシュ分割FIXハッシュ分割があります。

フレキシブルハッシュ分割では,表を分割してRDエリアに格納する場合,どのRDエリアに分割されるか定まりません。このため,検索処理では,該当する表があるすべてのバックエンドサーバが対象になります。

FIXハッシュ分割では,表がどのRDエリアに分割されたかをHiRDBが認識します。このため,検索処理では,該当するデータがあると予測されるバックエンドサーバだけが対象になります。

(a) 分割キーの選択方法

分割キーには次に示すようなキーを指定してください。

また,ハッシュ分割では,分割キーに単一列と複数列が選択できます。単一列を指定した場合,分割列のキー値の種類が少なかったり,キー値に偏りがあるとデータを均等に分割できないことがあります。この場合,分割する列名を複数指定して,データをRDエリアに均等に分割させるようにします。

(b) ハッシュ関数の種類

ハッシュ分割で使用するハッシュ関数の内容を次の表に示します。

表12-2 ハッシュ関数の内容

ハッシュ関数 説明
HASH0 このハッシュ関数は,分割に指定した列のデータ型がDATE,TIMESTAMP,CHAR(8)※1,又はCHAR(6)※1で,年月の値を使用してハッシングし,データを格納するRDエリアを月単位で循環させて割り当てる場合に使用します。分割キーは単一列を指定する必要があります。
HASH1 このハッシュ関数は,分割に指定した列のすべてのデータ型に使用できます。分割に指定したすべての列のデータの全バイト※2を使用してハッシュします。データ長が0バイト以上の列に指定できます。
HASH2 このハッシュ関数は,分割に指定した列のすべてのデータ型に使用できます。分割に指定したすべての列のデータの全バイト※2を使用してハッシュします。データ長が0バイト以上の列に指定できます。
HASH1を指定してデータを均等にRDエリアに格納できなかった場合に指定します。
HASH3 このハッシュ関数は,分割に指定した列のデータ型がINTEGER,又はSMALLINTの場合に使用します。分割したすべての列の末尾2バイト※2を使用してハッシュします。データ長が2バイト以上の列に指定できます。
HASH4 このハッシュ関数は,分割に指定した列のデータ型がDATEの場合に使用します。分割に指定したすべての列の先頭4バイト※2を使用してハッシュします。データ長が4バイト以上の列に指定できます。
HASH5 このハッシュ関数は,分割に指定した列のデータ型がTIMEの場合に使用します。分割に指定したすべての列の先頭3バイト※2を使用してハッシュします。データ長が3バイト以上の列に指定できます。
HASH6 このハッシュ関数は,分割に指定した列のすべてのデータ型に使用できます。DECIMALの場合に最も適しています。分割に指定したすべての列の,データの全バイト※2を使用してハッシュします。データ長が0バイト以上の列に指定できます。
HASHA このハッシュ関数は,分割に指定した列のすべてのデータ型に使用できます。分割に指定したすべての列のデータの全バイト※2を使用してハッシュします。データ長が0バイト以上の列に指定できます。
HASHB このハッシュ関数は,分割に指定した列のすべてのデータ型に使用できます。分割に指定したすべての列のデータの全バイト※2を使用してハッシュします。データ長が0バイト以上の列に指定できます。
HASHAを指定してデータを均等にRDエリアに格納できなかった場合に指定します。
HASHC このハッシュ関数は,分割に指定した列のデータ型がINTEGER,又はSMALLINTの場合に使用します。分割したすべての列の末尾2バイト※2を使用してハッシュします。データ長が2バイト以上の列に指定できます。
HASHD このハッシュ関数は,分割に指定した列のデータ型がDATEの場合に使用します。分割に指定したすべての列の先頭4バイト※2を使用してハッシュします。データ長が4バイト以上の列に指定できます。
HASHE このハッシュ関数は,分割に指定した列のデータ型がTIMEの場合に使用します。分割に指定したすべての列の先頭3バイト※2を使用してハッシュします。データ長が3バイト以上の列に指定できます。
HASHF このハッシュ関数は,分割に指定した列のすべてのデータ型に使用できます。DECIMALの場合に最も適しています。分割に指定したすべての列の,データの全バイト※2を使用してハッシュします。データ長が0バイト以上の列に指定できます。

注1
  • リバランス表でない場合はHASH0〜HASH6のどれかを指定してください。HASH6が最も均等にハッシングされるので,通常はHASH6を指定してください。ただし,分割キーのデータによっては均等にならない場合もあるので,そのときにはほかのハッシュ関数を指定してください。
  • リバランス表の場合はHASHA〜HASHFのどれかを指定してください。HASHFが最も均等にハッシングされるので,通常はHASHFを指定してください。ただし,分割キーのデータによっては均等にならない場合もあるので,そのときにはほかのハッシュ関数を指定してください。

注2
分割キーにLOB列は指定できません。

注※1
データ型がCHAR(8)及びCHAR(6)の場合の形式は次のようにしてください。
  • CHAR(8)の場合:'YYYYMMDD'
  • CHAR(6)の場合:'YYYYMM'
    YYYY:0001〜9999(年)
    MM:01〜12(月)
    DD:01〜該当年月の最終日(日)

注※2
VARCHAR型,MVARCHAR型,又はNVARCHAR型は,後続の空白を無視してハッシュします。また,DECIMAL型,INTERVAL YEAR TO DAY型,又はINTERVAL HOUR TO SECOND型で符号部が'F'の場合は,'C'に変換してハッシュします。
(c) ハッシュ関数の選択方法

実際にデータベースにデータを格納して選択する方法
この場合のハッシュ関数の選択手順を次に示します。
  1. 分割キーに対応して有効なハッシュ関数を指定します。
  2. データベース状態解析ユティリティ(pddbst)でRDエリアごとに格納されている行数を確認します。
  3. RDエリアごとに格納している行数に偏りがある場合には,ハッシュ関数を変更し,RDエリアごとの格納行数が均等になるようにします。
  4. 3.の方法で格納行数が均等にならない場合は,格納行数の少ないRDエリアを重複して指定することで,格納行数が均等になるようにします。この場合の例を次の図に示します。

    図12-4 ハッシュ分割で表格納用RDエリアを重複指定する例

    [図データ]

表分割ハッシュ関数を使用したUAPを作成し,ハッシュ関数を選択する方法
この場合のハッシュ関数の選択手順を次に示します。
  1. HiRDBからライブラリとして提供されている,表分割ハッシュ関数(分割キーのデータ値を入力すると分割条件指定順序を出力する関数)を使用して,RDエリアごとのデータ件数の偏りを求めるUAPを作成します。
  2. ハッシュ関数ごとに,表分割ハッシュ関数が出力する分割条件指定順序ごとの件数を求め,最も偏りが少ないハッシュ関数を選択します。

表分割ハッシュ関数を使用したUAPの作成方法については,マニュアル「HiRDB Version 8 UAP開発ガイド」を参照してください。

(d) ハッシュ関数が使用されるタイミング

ハッシュ関数は次に示すときに使用されます。

(3) キーレンジ分割,フレキシブルハッシュ分割及びFIXハッシュ分割の相違点

キーレンジ分割,フレキシブルハッシュ分割及びFIXハッシュ分割の相違点を次の表に示します。

表12-3 キーレンジ分割,フレキシブルハッシュ分割及びFIXハッシュ分割の相違点

相違点 キーレンジ分割 フレキシブル
ハッシュ分割
FIXハッシュ分割
データベース設計 キーレンジを考慮して,データベースを設計する必要があります。 キーレンジを考慮しないでデータベースを設計できます。 キーレンジを考慮しないでデータベースを設計できます。
検索 検索条件によって,該当データが存在する可能性のあるバックエンドサーバだけ検索します。1 対象表のある全バックエンドサーバで検索します。 探索条件に分割列に対する=,IN述語を指定した場合に,該当データが存在する可能性のあるRDエリアだけ検索します。ただし,ハッシュ関数にHASH0を使用した場合は,=述語,IN述語,(<,>,<=,>=による)範囲条件,BETWEEN述語,(前方一致比較の)LIKE述語,(前方一致比較の)SIMILAR述語を指定したときに検索します。1
データ増加時の
対応
キーが増加するデータの場合,データの格納が特定の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 8 UAP開発ガイド」を参照してください。

(4) 表の横分割定義時の指定規則

表の横分割定義時の指定規則を次に示します。

注※1
次のデータ型の列及び繰返し列は,分割キーに指定できません。
  • 定義長が256バイト以上のCHAR,VARCHAR,MCHAR,MVARCHAR型
  • 定義長が28文字以上のNCHAR,NVARCHAR型
  • BLOB型
  • BINARY型
  • 抽象データ型
  • 小数秒精度が0より大きいTIMESTAMP型
  • 既定値にCURRENT_TIMESTAMP USING BESを指定したTIMESTAMP型

注※2
格納条件を複数指定した場合,格納条件の指定順に条件を評価し,最初に真となった格納条件に指定したRDエリアに格納します。すべての条件で真とならない場合,格納条件を指定していないRDエリアに格納します。ただし,格納条件を指定していないRDエリアがない場合,どのRDエリアにも格納されません。また,条件を評価した結果,行が1行も格納されないRDエリアがある指定の表定義はできません。

注※3
境界値には定数を指定します。ただし,長さが0の文字列定数は指定できません。境界値を複数指定する場合,昇順となるように指定してください。また,境界値を指定しないRDエリアを最後に必ず指定してください。

(5) キーレンジ分割(格納条件指定)の例

キーレンジ分割(格納条件指定)の例を次の図に示します。

図12-5 キーレンジ分割(格納条件指定)の例

[図データ]

〔説明〕
ZAIKO表の商品コード列(SCODE)の範囲(100L〜399Sと400L〜699S)を条件として,複数のユーザ用RDエリア(USR01とUSR02)に横分割します。

(6) キーレンジ分割(境界値指定)の例

キーレンジ分割(境界値指定)の例を次の図に示します。

図12-6 キーレンジ分割(境界値指定)の例

[図データ]

〔説明〕
ZAIKO表の商品コード列(SCODE)の302S,591Sを境界値として,複数のユーザ用RDエリア(USR01とUSR02)に横分割します。

(7) フレキシブルハッシュ分割及びFIXハッシュ分割の例

フレキシブルハッシュ分割,FIXハッシュ分割の例を次の図に示します。

図12-7 フレキシブルハッシュ分割,FIXハッシュ分割の例

[図データ]

〔説明〕
ZAIKO表の商品コード列(SCODE)を分割キーとして,ハッシュ関数HASH6を使用して複数のユーザ用RDエリア(USR01とUSR02)に横分割します。
なお,実際のデータの格納先RDエリアはこの例と異なることがあります。