13.15.5 例題5 RDエリアを年月日単位に循環させて割り当てる場合(マトリクス分割でない場合)
ハッシュ関数HASHZを使用して,KESSAI表に2011年7月31日〜9月1日の1か月+2日分のデータを保持している状態で,最も古い2011年7月31日のデータをRDエリア単位に削除し,新しい2011年9月2日のデータを格納する例を説明します。
RDエリアを年月日単位に循環させて割り当てる場合(マトリクス分割でない場合)の例を次の図に示します。
|
注1 RDエリア名の(m)は,分割条件指定順序を示しています。
注2 KESSAI表は,次のように定義されているものとします。
CREATE TABLE KESSAI (DNO CHAR(6), TCODE CHAR(5), SCODE CHAR(4), JDATE CHAR(8) NOT NULL) 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);
- 〈この項の構成〉
(1) 削除対象の2011年7月31日のデータが格納されているRDエリア名を特定します
次のどちらかの方法でRDエリア名を特定します。
(a) 表分割ハッシュ関数p_rdb_dbhashを使用する方法
(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(分割条件指定順序,又は分割キー内通番) |
なし |
- 注
-
文字コード種別,空白変換レベル,及びDECIMAL型の符号正規化機能は,すべて省略しているものとします。
上記の表分割ハッシュ関数を実行すると,分割条件指定順序としてrdno=1が返ってきます。
(ii) SQLの実行
表分割ハッシュ関数の結果を基に,次のSQLを実行し,RDエリア名を特定します。
SELECT RDAREA_NAME FROM MASTER.SQL_DIV_TABLE WHERE TABLE_SCHEMA='USER1' /* ユーザ名 */ AND TABLE_NAME='KESSAI' /* ハッシュ分割表名 */ AND DIV_NO=1 /* 分割条件指定順序 */
上記のSQLを実行すると,次に示すように削除対象のRDエリア名としてRDA1が返ってきます。
RDAREA_NAME ------------------------------ RDA1
(b) CREATE PUBLIC FUNCTIONを定義しておく方法
(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;
- 注※
-
列のデータはCHAR(8)ですが,パラメタはVARCHARでなければ文字列定数を指定した呼び出しができません。
(ii) SQLの実行
次のSQLで,2011年7月31日のデータがどこに入っているのかを検索します。
SELECT RDAREA_NAME FROM MASTER.SQL_DIV_TABLE WHERE TABLE_SCHEMA='USER1' /* ユーザ名 */ AND TABLE_NAME='KESSAI' /* ハッシュ分割表名 */ AND DIV_NO=HASHZ('20110731',33); /* RDエリア定義順序 */
上記のSQLを実行すると,次に示すように削除対象のRDエリア名としてRDA1が返ってきます。
RDAREA_NAME ------------------------------ RDA1
(2) pdholdコマンドでアンロード対象RDエリアを閉塞します
pdhold -r RDA1
(3) pdrorgコマンドでKESSAI表のRDA1のデータをアンロードします
pdrorg -k unld -t KESSAI -r RDA1 unload_control_file
- 〔説明〕
-
-k:アンロードをするためunldを指定します。
-t:アンロードする表の名称を指定します。
-r:特定のRDエリアだけアンロードするため,対象となるRDエリア名を指定します。
unload_control_file:pdrorgコマンドの制御情報ファイル名を指定します。制御情報ファイルの内容を次に示します。
unload bes1:/pdrorg/unload_file /* bes1:アンロードデータファイルがあるサーバの名称 */ /* /pdrorg/unload_file:アンロードデータファイルの名称 */
(4) pdloadコマンドでRDA1に対して0件のデータロードをします
最も古い2011年7月31日のデータ(RDA1のデータ)を削除するため,0件のデータロードを実行します。
pdload -d KESSAI load_control_file
- 〔説明〕
-
-d:既存のデータを削除してからデータロードをするために指定します。
KESSAI:データロードする表の名称を指定します。
load_control_file:pdloadコマンドの制御情報ファイル名を指定します。制御情報ファイルの内容を次に示します。
source RDA1 bes1:/pdload/load_file /* RDA1:0件のデータをデータロードするRDエリアの名称 */ /* bes1:ロードする0件データファイルがあるサーバの名称 */ /* /pdload/load_file:ロードする0件データファイルの名称 */
分割表に,分割していない非分割インデクスを定義している場合,pdloadコマンド実行後に非分割インデクスを一括作成してください。
(5) pdrelsコマンドでRDエリアの閉塞を解除します
pdrels -r RDA1
コマンドの実行後,UAPなどで2011年9月2日のデータを挿入すると,RDA1にデータが格納されます。
なお,コマンドの実行後,実行結果が正しいかどうか確認することをお勧めします。コマンドの実行結果の確認方法については,マニュアル「HiRDB Version 9 コマンドリファレンス」を参照してください。