ノンストップデータベース HiRDB Version 9 システム運用ガイド(UNIX(R)用)

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

13.15.4 例題4 RDエリアを年月単位に循環させて割り当てる場合(マトリクス分割の場合)

ハッシュ関数HASH0を使用したマトリクス分割表を定義して,JUTYU表に2011年5月〜9月の最新5か月のデータを保持している状態で,最も古い2011年5月の1か月分のデータをRDエリア単位に削除し,新しい2011年10月のデータを格納する例を説明します。なお,ここでのマトリクス分割表は,次のように分割しているものとします。

RDエリアを年月単位に循環させて割り当てる場合(マトリクス分割の場合)の例を次の図に示します。

図13-89 RDエリアを年月単位に循環させて割り当てる場合(マトリクス分割の場合)

[図データ]

注1 RDエリア名の(m)は,分割条件指定順序を示しています。

注2 JUTYU表は,次のように定義されているものとします。
       CREATE TABLE JUTYU
         (DNO CHAR(6), TCODE CHAR(5), SCODE CHAR(4) NOT NULL, JDATE CHAR(8) NOT NULL)
           PARTITIONED BY MULTIDIM
           (SCODE(('100')),
           FIX HASH HASHZ BY JDATE) IN
           ((RDA1,RDA2,RDA3,RDA4,RDA5), (RDA6,RDA7,RDA8,RDA9,RDA10));
<この項の構成>
(1) 削除対象の2011年5月のデータが格納されているRDエリア名を特定します
(2) pdholdコマンドでアンロード対象RDエリアを閉塞します
(3) pdrorgコマンドでJUTYU表のRDA1及びRDA6のデータをアンロードします
(4) pdloadコマンドでRDA1及びRDA6に対して0件のデータロードをします
(5) pdrelsコマンドでRDエリアの閉塞を解除します

(1) 削除対象の2011年5月のデータが格納されているRDエリア名を特定します

次のどちらかの方法でRDエリア名を特定します。

(a) 表分割ハッシュ関数p_rdb_dbhashを使用する方法

(i) 表分割ハッシュ関数の実行

HiRDBが提供する表分割ハッシュ関数を使用して,削除対象の2011年5月のデータが格納されているRDエリア名を特定します。表分割ハッシュ関数の引数を次に示します。なお,表分割ハッシュ関数については,マニュアル「HiRDB Version 9 UAP開発ガイド」を参照してください。

項番 引数 指定値
1 hashcode(ハッシュ関数コード) p_rdb_HASH0(100)
2 ncol(分割キーの列数) 1
3 collst(分割キーの指定順序とデータ型コード,データ長コード) データ型コード:PDSQL_CHAR
データ長コード:8
4 dadlst(分割キーに格納するデータ) 項番3のデータ型の値
5 ndiv(表の分割数) 5
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,DCVALUES
    FROM MASTER.SQL_DIV_TABLE
      WHERE TABLE_SCHEMA='USER1'     /* ユーザ名 */
        AND TABLE_NAME='JUTYU'       /* ハッシュ分割表名 */
          AND MOD(DIV_NO-1,5)+1 = 1  /* RDエリア定義順序 */
 

上記のSQLを実行すると,次のように削除対象のRDエリア名としてRDA1及びRDA6が返ってきます。

 
 RDAREA_NAME                   DCVALUES
 --------------------------    ----------------------
 RDA1                          100
 RDA6                          *********************
 

注※
DCVALUES列も同時に検索することによって,RDエリアが第1次元のどの分割に対応するかの情報も得られます。
(b) CREATE PUBLIC FUNCTIONを定義しておく方法

(i) CREATE PUBLIC FUNCTIONの定義

ハッシュ関数HASH0の場合,次のSQLをあらかじめ定義しておくことでRDエリアを特定できます。

 
CREATE PUBLIC FUNCTION HASH0
 (DIVKEY VARCHAR(8),          /* ‘YYYYMMDD’ 又は ‘YYYYMM’ */
  NDIV INT)                    /* 分割列数 */
  RETURNS INT 
    BEGIN 
      DECLARE DIVDATE DATE; 
      SET DIVDATE = CASE LENGTH(DIVKEY)
             WHEN 6 THEN DATE(SUBSTR(DIVKEY,1,6)||'01','YYYYMMDD')
             ELSE DATE(DIVKEY,'YYYYMMDD')
             END;
  RETURN MOD(YEAR(DIVDATE)*12+MONTH(DIVDATE), NDIV)+1;    /* 戻り値 */
  END 
END_FUNC;
 

注※
列のデータはCHAR(8)ですが,パラメタはVARCHARでなければ文字列定数を指定した呼び出しができません。

(ii) SQLの実行

次のSQLで,2011年5月のデータがどこに入っているのかを検索します。

 
SELECT RDAREA_NAME,DCVALUES
  FROM MASTER.SQL_DIV_TABLE
    WHERE TABLE_SCHEMA='USER1'                   /* ユーザ名 */
      AND TABLE_NAME='JUTYU'                     /* ハッシュ分割表名 */
      AND MOD(DIV_NO-1,5)+1=HASH0('20110531',5)  /* RDエリア定義順序 */
 

上記のSQLを実行すると,次のように削除対象のRDエリア名としてRDA1及びRDA6が返ってきます。

 
 RDAREA_NAME                   DCVALUES
 --------------------------    ----------------------
 RDA1                          100
 RDA6                          *********************
 

注※
DCVALUES列も同時に検索することによって,RDエリアが第1次元のどの分割に対応するかの情報も得られます。

(2) pdholdコマンドでアンロード対象RDエリアを閉塞します

 
pdhold -r RDA1
pdhold -r RDA6
 

(3) pdrorgコマンドでJUTYU表のRDA1及びRDA6のデータをアンロードします

 
pdrorg -k unld -t JUTYU -r RDA1 unload_control_file1
 
 
pdrorg -k unld -t JUTYU -r RDA6 unload_control_file6
 

〔説明〕
-k:アンロードをするためunldを指定します。
-t:アンロードする表の名称を指定します。
-r:特定のRDエリアだけアンロードするため,対象となるRDエリア名を指定します。
unload_control_file:pdrorgコマンドの制御情報ファイル名を指定します。制御情報ファイルの内容を次に示します。

<RDA1の場合>
unload bes1:/pdrorg/unload_file1
 
/* bes1:アンロードデータファイルがあるサーバの名称 */
/* /pdrorg/unload_file1:アンロードデータファイルの名称 */
 

<RDA6の場合>
unload bes1:/pdrorg/unload_file6
 
/* bes1:アンロードデータファイルがあるサーバの名称 */
/* /pdrorg/unload_file6:アンロードデータファイルの名称 */
 

(4) pdloadコマンドでRDA1及びRDA6に対して0件のデータロードをします

最も古い2011年5月のデータ(RDA1及びRDA6のデータ)を削除するため,0件のデータロードを実行します。

 
pdload -d JUTYU load_control_file1
 
 
pdload -d JUTYU load_control_file6
 

〔説明〕
-d:既存のデータを削除してからデータロードをするために指定します。
JUTYU:データロードする表の名称を指定します。
load_control_file:pdloadコマンドの制御情報ファイル名を指定します。制御情報ファイルの内容を次に示します。

<RDA1の場合>
source RDA1 bes1:/pdload/load_file1
 
/* RDA1:0件のデータをデータロードするRDエリアの名称 */
/* bes1:ロードする0件データファイルがあるサーバの名称 */
/* /pdload/load_file1:ロードする0件データファイルの名称 */
 

<RDA6の場合>
source RDA6 bes1:/pdload/load_file6
 
/* RDA6:0件のデータをデータロードするRDエリアの名称 */
/* bes1:ロードする0件データファイルがあるサーバの名称 */
/* /pdload/load_file6:ロードする0件データファイルの名称 */

分割表に,分割していない非分割インデクスを定義している場合,pdloadコマンド実行後に非分割インデクスを一括作成してください。

(5) pdrelsコマンドでRDエリアの閉塞を解除します

 
pdrels -r RDA1
pdrels -r RDA6
 

コマンドの実行後,UAPなどで2011年10月のデータを挿入すると,RDA1及びRDA6にデータが格納されます。

なお,コマンドの実行後,実行結果が正しいかどうか確認することをお勧めします。コマンドの実行結果の確認方法については,マニュアル「HiRDB Version 9 コマンドリファレンス」を参照してください。