ノンストップデータベース HiRDB Version 9 システム運用ガイド(UNIX(R)用)
ハッシュ関数HASHZを使用したマトリクス分割表を定義して,KESSAI表に2011年7月31日〜9月1日の1か月+2日分のデータを保持している状態で,最も古い2011年7月31日のデータをRDエリア単位に削除し,新しい2011年9月2日のデータを格納する例を説明します。なお,ここでのマトリクス分割表は,次のように分割しているものとします。
RDエリアを年月日単位に循環させて割り当てる場合(マトリクス分割の場合)の例を次の図に示します。
図13-91 RDエリアを年月日単位に循環させて割り当てる場合(マトリクス分割の場合)
CREATE TABLE KESSAI
(DNO CHAR(6), TCODE CHAR(5), SCODE CHAR(4) NOT NULL, JDATE CHAR(8) NOT NULL)
PARTITIONED BY MULTIDIM
(SCODE(('100'),('200')),
FIX HASH HASHZ BY JDATE) IN
((RDA1,RDA2,RDA3,RDA4,RDA5,RDA6,RDA7,RDA8,RDA9,RDA10
,RDA11,RDA12,RDA13,RDA14,RDA15,RDA16,RDA17,RDA18,RDA19,RDA20
,RDA21,RDA22,RDA23,RDA24,RDA25,RDA26,RDA27,RDA28,RDA29,RDA30
,RDA31,RDA32,RDA33),(RDA34,RDA35,RDA36,RDA37,RDA38,RDA39,RDA40
,RDA41,RDA42,RDA43,RDA44,RDA45,RDA46,RDA47,RDA48,RDA49,RDA50
,RDA51,RDA52,RDA53,RDA54,RDA55,RDA56,RDA57,RDA58,RDA59,RDA60
,RDA61,RDA62,RDA63,RDA64,RDA65,RDA66),(RDA67,RDA68,RDA69,RDA70
,RDA71,RDA72,RDA73,RDA74,RDA75,RDA76,RDA77,RDA78,RDA79,RDA80
,RDA81,RDA82,RDA83,RDA84,RDA85,RDA86,RDA87,RDA88,RDA89,RDA90
,RDA91,RDA92,RDA93,RDA94,RDA95,RDA96,RDA97,RDA98,RDA99));
次のどちらかの方法でRDエリア名を特定します。
(i) 表分割ハッシュ関数の実行
HiRDBが提供する表分割ハッシュ関数を使用して,削除対象の2011年7月31日のデータが格納されているRDエリア名を特定します。表分割ハッシュ関数の引数を次に示します。なお,表分割ハッシュ関数については,マニュアル「HiRDB Version 9 UAP開発ガイド」を参照してください。
| 項番 | 引数 | 指定値 |
|---|---|---|
| 1 | hashcode(ハッシュ関数コード) | p_rdb_HASHZ(99) |
| 2 | ncol(分割キーの列数) | 1 |
| 3 | collst(分割キーの指定順序とデータ型コード,データ長コード) | データ型コード:PDSQL_CHAR データ長コード:8 |
| 4 | dadlst(分割キーに格納するデータ) | 項番3のデータ型の値 |
| 5 | ndiv(表の分割数) | 33 |
| 6 | ncspace(HiRDBサーバで使用する各国文字の全角空白文字) | ncspace[0]:0x81 ncspace[1]:0x40 |
| 7 | flags(空白変換レベル,DECIMAL型の符号正規化機能の使用有無) | 0 |
| 8 | rdno(分割条件指定順序,又は分割キー内通番) | なし |
上記の表分割ハッシュ関数を実行すると,分割条件指定順序としてrdno=1が返ってきます。
(ii) SQLの実行
表分割ハッシュ関数の結果を基に,次のSQLを実行し,RDエリア名を特定します。
SELECT RDAREA_NAME,DCVALUES
FROM MASTER.SQL_DIV_TABLE
WHERE TABLE_SCHEMA='USER1' /* ユーザ名 */
AND TABLE_NAME='KESSAI' /* ハッシュ分割表名 */
AND MOD(DIV_NO-1,33)+1 = 1 /* RDエリア定義順序 */
上記のSQLを実行すると,次に示すように削除対象のRDエリア名としてRDA1,RDA34及びRDA67が返ってきます。
RDAREA_NAME DCVALUES※ ------------------------------ ---------------------- RDA1 100 RDA34 200 RDA67 ********************* |
(i) CREATE PUBLIC FUNCTIONの定義
ハッシュ関数HASHZの場合,次のSQLをあらかじめ定義しておくことでRDエリアを特定できます。
CREATE PUBLIC FUNCTION HASHZ
(IDATE VARCHAR(8)※, /* ‘YYYYMMDD’ */
NDIV INT) /* 分割列数 */
RETURNS INT
BEGIN
RETURN MOD(DAYS(DATE(IDATE,'yyyymmdd'),NDIV)+1; /* HASHZによる戻り値 */
END
END_FUNC;
(ii) SQLの実行
次のSQLで,2011年7月31日のデータがどこに入っているのかを検索します。
SELECT RDAREA_NAME,DCVALUES
FROM MASTER.SQL_DIV_TABLE
WHERE TABLE_SCHEMA='USER1' /* ユーザ名 */
AND TABLE_NAME='KESSAI' /* ハッシュ分割表名 */
AND MOD(DIV_NO-1,33)+1=HASHZ('20110731',33) /* RDエリア定義順序 */
上記のSQLを実行すると,次に示すように削除対象のRDエリア名としてRDA1,RDA34及びRDA67が返ってきます。
RDAREA_NAME DCVALUES※ ------------------------------ ---------------------- RDA1 100 RDA34 200 RDA67 ********************* |
pdhold -r RDA1 pdhold -r RDA34 pdhold -r RDA67 |
pdrorg -k unld -t KESSAI -r RDA1 unload_control_file1 |
pdrorg -k unld -t KESSAI -r RDA34 unload_control_file34 |
pdrorg -k unld -t KESSAI -r RDA67 unload_control_file67 |
unload bes1:/pdrorg/unload_file1 /* bes1:アンロードデータファイルがあるサーバの名称 */ /* /pdrorg/unload_file1:アンロードデータファイルの名称 */
unload bes1:/pdrorg/unload_file34 /* bes1:アンロードデータファイルがあるサーバの名称 */ /* /pdrorg/unload_file34:アンロードデータファイルの名称 */
unload bes1:/pdrorg/unload_file67 /* bes1:アンロードデータファイルがあるサーバの名称 */ /* /pdrorg/unload_file67:アンロードデータファイルの名称 */
最も古い2011年7月31日のデータ(RDA1,RDA34及びRDA67のデータ)を削除するため,0件のデータロードを実行します。
pdload -d KESSAI load_control_file1 |
pdload -d KESSAI load_control_file34 |
pdload -d KESSAI load_control_file67 |
source RDA1 bes1:/pdload/load_file1 /* RDA1:0件のデータをデータロードするRDエリアの名称 */ /* bes1:ロードする0件データファイルがあるサーバの名称 */ /* /pdload/load_file1:ロードする0件データファイルの名称 */
source RDA34 bes1:/pdload/load_file34 /* RDA34:0件のデータをデータロードするRDエリアの名称 */ /* bes1:ロードする0件データファイルがあるサーバの名称 */ /* /pdload/load_file34:ロードする0件データファイルの名称 */
source RDA67 bes1:/pdload/load_file67 /* RDA67:0件のデータをデータロードするRDエリアの名称 */ /* bes1:ロードする0件データファイルがあるサーバの名称 */ /* /pdload/load_file67:ロードする0件データファイルの名称 */
分割表に,分割していない非分割インデクスを定義している場合,pdloadコマンド実行後に非分割インデクスを一括作成してください。
pdrels -r RDA1 pdrels -r RDA34 pdrels -r RDA67 |
コマンドの実行後,UAPなどで2011年9月2日のデータを挿入すると,RDA1,RDA34,RDA67にデータが格納されます。
なお,コマンドの実行後,実行結果が正しいかどうか確認することをお勧めします。コマンドの実行結果の確認方法については,マニュアル「HiRDB Version 9 コマンドリファレンス」を参照してください。
All Rights Reserved. Copyright (C) 2010, 2017, Hitachi, Ltd.