Hitachi

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


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

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

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

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

[図データ]

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

注2 KESSAI表は,次のように定義されているものとします。

      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));
〈この項の構成〉

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

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

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

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

HiRDBが提供する表分割ハッシュ関数を使用して,削除対象の2011年7月31日のデータが格納されているRDエリア名を特定します。表分割ハッシュ関数の引数を次に示します。なお,表分割ハッシュ関数については,マニュアル「HiRDB 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,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                             *********************
注※

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

(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,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                             *********************
注※

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

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

pdhold -r RDA1
pdhold -r RDA34
pdhold -r RDA67

(3) pdrorgコマンドでKESSAI表のRDA1,RDA34及び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
〔説明〕

-k:アンロードをするためunldを指定します。

-t:アンロードする表の名称を指定します。

-r:特定のRDエリアだけアンロードするため,対象となるRDエリア名を指定します。

unload_control_file:pdrorgコマンドの制御情報ファイル名を指定します。制御情報ファイルの内容を次に示します。

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

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

最も古い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
〔説明〕

-d:既存のデータを削除してからデータロードをするために指定します。

KESSAI:データロードする表の名称を指定します。

load_control_file:pdloadコマンドの制御情報ファイル名を指定します。制御情報ファイルの内容を次に示します。

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

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

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

pdrels -r RDA1
pdrels -r RDA34
pdrels -r RDA67

コマンドの実行後,UAPなどで2011年9月2日のデータを挿入すると,RDA1,RDA34,RDA67にデータが格納されます。

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