ページの先頭行へ戻る
Symfoware Server V12.7.0 RDB運用ガイド(XMLアダプタ編)
FUJITSU Software

3.2.1 XMLデータのインデックスを作成する

データベース設計時にXMLデータを使用する検索業務が決まっており、XMLデータのインデックスを設計できる場合の運用形態について説明します。

以下に運用手順を示します。

図3.2 XMLアダプタの運用手順

図3.3 論理構造とXMLデータ”、“図3.4 格納構造と論理構造”に示すデータベースの論理構造と格納構造を例に運用手順を説明します。

参照

表、インデックスに対する定義については、“RDB運用ガイド(データベース定義編)”を参照してください。

図3.3 論理構造とXMLデータ

図3.4 格納構造と論理構造


  1. データベース名の登録

    データベース名の登録は、CREATE DATABASE文で行います。このSQL文で、登録するデータベース名を指定します。指定したデータベース名がRDBディクショナリに登録されます。

    ここでは、データベースとして、伝票管理DBを登録します。

    CREATE DATABASE  伝票管理DB ;

  2. データベーススペースの作成

    データベーススペースの作成は、CREATE DBSPACE文で行います。CREATE DBSPACE文では、データベーススペース名と、データベーススペースを作成するファイル名を指定します。
    ここでは、データベーススペースをDBSP_1とします。

    SolarisSolarisの場合

    ローデバイス名を/dev/rdsk/c3t1d0s3とします。ローデバイス名は、すでに定義済みで実在するものでなければなりません。

    CREATE DBSPACE  DBSP_1  ALLOCATE  RAWDEVICE /dev/rdsk/c3t1d0s3 ;

    LinuxLinuxの場合

    ローデバイス名を/dev_symfoware/raw10とします。ローデバイス名は、すでに定義済みで実在するものでなければなりません。

    CREATE DBSPACE  DBSP_1  ALLOCATE  RAWDEVICE /dev_symfoware/raw10 ;

    WindowsWindowsの場合

    ファイル名をE:\SFWD\RDB\USR\DBSP\DBSP_1とします。

    CREATE DBSPACE  DBSP_1  ALLOCATE  FILE  E:\SFWD\RDB\USR\DBSP\DBSP_1  ATTRIBUTE  SPACE(100M);

  3. 論理構造の定義

    データベーススペースの作成が終了したあと、論理構造の定義を行います。論理構造の定義を行うと、その情報がRDBディクショナリに格納されます。論理構造の定義には、スキーマ定義、順序定義、表定義、ビュー定義、権限情報定義、トリガ定義、プロシジャルーチン定義およびファンクションルーチン定義があります。ここでは、スキーマ定義、表定義だけを行うものとします。

    CREATE SCHEMA  伝票スキーマ   COMMENT  ' 伝票管理用 ' ;
    CREATE TABLE   伝票スキーマ.伝票表      (伝票番号   INTEGER       NOT NULL,
                                             部門コード SMALLINT      NOT NULL,
                                             伝票種別   CHARACTER(2)  NOT NULL,
                                             伝票       BLOB(2K)      NOT NULL,
                                             PRIMARY KEY(伝票番号)) ;

  4. 格納構造の定義

    論理構造の定義が終了した後、格納構造の定義を行います。格納構造の定義を行うと、その情報がRDBディクショナリに格納されます。格納構造の定義には、DSO定義とDSI定義の2つがあります。論理構造の定義で作成された表に対して、表のDSO定義および表のDSI定義を行います。

    また、表に対してインデックスを定義する場合には、インデックスのDSO定義およびインデックスのDSI定義を行います。同様に、表に対してXMLデータのインデックスを定義する場合は、XML構造のインデックスのDSO定義およびXMLデータのインデックスのDSI定義を行います。格納構造定義は、DSO定義文およびDSI定義文を実行することにより行います。

    1. DSO定義
      表、インデックスおよびXMLデータのインデックスのDSOを定義します。

      CREATE DSO  伝票表DSO  FROM  伝票スキーマ.伝票表
                        TYPE  SEQUENTIAL(PAGESIZE(4), ORDER(0)) ;
        
      CREATE DSO  伝票番号IXDSO  INDEX  ON 伝票スキーマ.伝票表  (伝票番号)
                        TYPE  BTREE(PAGESIZE1(16), PAGESIZE2(1))
                        BY  ADDRESS ;
        
      CREATE DSO  伝票IXDSO  INDEX  ON  伝票スキーマ.伝票表  (伝票)
                        TYPE  XML(PAGESIZE1(16), PAGESIZE2(1))
                        BY  ADDRESS ;
    2. DSI定義
      表、インデックスおよびXMLデータのインデックスのDSIを定義します。

      CREATE DSI  伝票表DSI1  DSO  伝票表DSO
                      ALLOCATE  DATA   ON  DBSP_1  SIZE  280K ;
        
      CREATE DSI  伝票番号IXDSI1  INDEX  DSO  伝票番号IXDSO
                      ALLOCATE  BASE   ON  DBSP_1  SIZE  200K ,
                                INDEX  ON  DBSP_1  SIZE   40K ;
        
      CREATE DSI  伝票IXDSI1  INDEX  DSO  伝票IXDSO
                      ALLOCATE  BASE   ON  DBSP_1  SIZE  200K ,
                                INDEX  ON  DBSP_1  SIZE   40K ;

  5. XMLグループの定義

    XMLデータのインデックスの構造を決めるため、XMLグループを定義します。XMLグループは、CREATE XMLGROUP文で定義します。

    XMLグループでは、XMLデータの構成要素の中で業務で検索対象とする検索パスを定義します。また、定義したXMLグループが適用される条件を規定する列とその列に格納される情報を選択条件として定義します。

    XMLグループは1つのXMLデータのインデックスに存在するDSOに対して複数定義できます。この場合、対象XMLデータのインデックスに存在するDSOに対してそれぞれのXMLグループを定義します。

    以下にXMLグループを1つ定義する場合の例を示します。ここでは、“図3.3 論理構造とXMLデータ”に示す構造のXMLデータを「伝票」列に格納するものとし、業務で検索対象とする検索パスは以下の3つとします。

    • /受注伝票/伝票番号

    • /受注伝票/受注先/社名

    • /受注伝票/商品*/商品名

    なお、商品タグは繰り返し構造をもつものとし、定義したXMLグループを適用する条件の情報は、「伝票種別」列に格納され、その値は“1”であるとします。

    CREATE XMLGROUP  受注伝票GR  ON  伝票IXDSO    (
                    '/受注伝票/伝票番号'        NUMBER(10,0),
                    '/受注伝票/受注先/社名'     STRING(20), 
                    '/受注伝票/商品*/商品名'    STRING(20)
                ) RULE  (伝票種別)  =  ('1');

  6. 最適化情報の設定

    データベースを効率よくアクセスするために、最適化情報の設定を行います。最適化情報は、格納構造の定義が完了した後に、データベースに格納するレコードの件数やインデックスキーのバリエーションを想定して値を設定します。最適化情報の設定は、XML構造以外の格納構造に対して行います。

    参照

    最適化情報の設定については、“RDB運用ガイド(データベース定義編)”を参照してください。

  7. データベース(DSI)の初期化

    DSIは、データを格納する前までに初期化しておきます。DSIの初期化は、rdbfmtコマンドで行います。ただし、rdbsloaderコマンドによりデータを格納する場合にはDSIの初期化は不要です。
    以下にrdbfmtコマンドの使用例を示します。

    rdbfmt  -mi  -i  伝票管理DB.伝票表DSI1
    rdbfmt  -mi  -i  伝票管理DB.伝票番号IXDSI1
    rdbfmt  -mi  -i  伝票管理DB.伝票IXDSI1

  8. データベース定義情報の保全

    データベースの定義情報の保全のために、RDBディクショナリのデータをバックアップします。アーカイブログ運用を行っている場合、この契機のバックアップは必須ではありません。RDBディクショナリのバックアップは、RDBディクショナリの規模やリカバリに要する時間を考慮して、任意の契機で、計画的にバックアップを行ってください。

    SolarisLinuxSolaris/Linuxの場合

    rdbdmpdic -f dicback@/home/rdb1/backup -e -y

    WindowsWindowsの場合

    rdbdmpdic -f DICBACK@E:\HOME\RDB1\BACKUP -e -y

    アーカイブログ運用を行っていない場合、RDBディクショナリに異常が発生したとき、システム全体をRDBディクショナリのバックアップ時点までリカバリできます。このため、Symfoware/RDBでは、データベース更新が主体の業務には、アーカイブログ運用を行い、データベース参照が主体の業務には、アーカイブログ運用を行わないことを推奨しています。


  9. データベースの創成

    データベースの創成方法として、以下の2つがあります。

    • データファイルを使用したrdbsloaderコマンドによる方法(DSI初期化不要)

    • 創成用のアプリケーションを作成してINSERT文によって行う方法(DSI初期化必要)

    [rdbsloaderコマンドによるデータベース創成]
    rdbsloaderコマンドによってデータベースを創成する例を以下に示します。rdbsloaderコマンドを実行することで、XMLデータのインデックスも同時に作成されます。

    SolarisLinuxSolaris/Linuxの場合

    rdbsloader  -mi  -i  伝票管理DB.伝票表DSI1   /home/rdb1/voucher.data

    WindowsWindowsの場合

    rdbsloader  -mi  -i  伝票管理DB.伝票表DSI1   E:\HOME\RDB1\VOUCHER.DATA

    [INSERT文によるデータベース創成]
    INSERT文によってデータベースを創成するアプリケーションの例を以下に示します。

    /*
     * 標準入力から入力されたデータを伝票表に格納する
     * 
     *   入力データ形式 : 以下の行の繰り返し
     *      伝票番号  部門コード  伝票種別  XMLデータファイル名
     * 
     */
    
    #include <stdio.h>
    #include <string.h>
    
    /* ホスト変数を宣言する */
    EXEC SQL BEGIN DECLARE SECTION;
        SQL TYPE IS BLOB(32K) SDATA;
        char    SQLSTATE[6];
        char    SQLMSG[256];
    EXEC SQL END DECLARE SECTION;
    
    int insert(int sno,short code,char *kind);
    
    int main(int argc, char **argv)
    {
        char in_buf[4096];
    
        EXEC SQL WHENEVER SQLERROR GO TO :ERROR;
      
        /* データベースに接続する */
        memset(SQLSTATE,0x00,sizeof(SQLSTATE));
        memset(SQLMSG,0x00,sizeof(SQLMSG));
        EXEC SQL CONNECT TO DEFAULT;   
    
        /* 標準入力から1行ずつ読み込む */
        while (fgets(in_buf, sizeof(in_buf), stdin) != NULL){
            FILE* fp;
            int sno;
            int code;
            char kind[10];
            char fname[256];
           
            /* 挿入するデータを特定する */
            if (sscanf(in_buf, "%d %d %s %s", &sno, &code, kind, fname) != 4){
                fprintf(stderr, "Invalid data\n");
                return 1;
            }
            
            /* XMLデータファイルの内容をホスト変数に読み込む */
            fp = fopen(fname, "r"); 
            if (fp == NULL){
                fprintf(stderr, "Can't open file: %s\n", fname);
                return 1;
            }
            SDATA.SDATA_length = 
                fread(SDATA.SDATA_data,1, sizeof(SDATA.SDATA_data), fp);
            
    
            /* データを挿入する */
            if (insert(sno, (short)code, kind) != 0){
                return 1;
            }
        }
    
        /* コミットする */
        memset(SQLSTATE,0x00,sizeof(SQLSTATE));
        memset(SQLMSG,0x00,sizeof(SQLMSG));
        EXEC SQL COMMIT WORK;
    
        return 0;
    
    ERROR:
        /* 異常終了 */
        fprintf(stderr, "ERROR OCCURED\n");
        fprintf(stderr, "SQLSTATE = %s\n",SQLSTATE);
        fprintf(stderr, "SQLMSG   = %s\n\n",SQLMSG);
        return 1;
    }
    
    int insert(int sno, short code, char *kind)
    {
        /* ホスト変数を宣言する */
        EXEC SQL BEGIN DECLARE SECTION;
            long    SNO;
            short   CODE;
            char    KIND[3];
        EXEC SQL END DECLARE SECTION;
    
        /* ホスト変数を初期化する */
        memset(KIND,0x00,sizeof(KIND));
        memset(SQLSTATE,0x00,sizeof(SQLSTATE));
        memset(SQLMSG,0x00,sizeof(SQLMSG));
    
        /* ホスト変数にデータを設定する */
        SNO = sno;
        CODE = code;
        memcpy(KIND,kind,2);
    
        EXEC SQL WHENEVER SQLERROR GO TO :ERROR;
    
        /* 伝票表へデータを格納する */
        EXEC SQL INSERT INTO 伝票スキーマ.伝票表
            VALUES(:SNO, :CODE, :KIND, :SDATA);
    
        /* 正常終了 */
        return 0;
    
    ERROR:
        /* 異常終了 */
        fprintf(stderr, "ERROR OCCURED\n");
        fprintf(stderr, "SQLSTATE = %s\n",SQLSTATE);
        fprintf(stderr, "SQLMSG   = %s\n\n",SQLMSG);
        return -1;
    }

  10. データベースのデータ退避

    データベースの運用前に、データ破壊などの異常時のリカバリに備えて、データベースをバックアップします。アーカイブログ運用を行っている場合、表のDSIおよびXMLデータのインデックスのDSIをバックアップしてください。
    アーカイブログ運用を行っている場合に、表のDSIとXMLデータのインデックスのDSIをバックアップする手順例を以下に示します。

    SolarisLinuxSolaris/Linuxの場合

    rdbdmp -t /home/rdb1/DSI/dsi.dat -e -y

    dsi.datの内容を以下に示します。

    伝票管理DB.伝票表DSI1 dmp1@/backup
    伝票管理DB.伝票IXDSI1 dmpx@/backup

    WindowsWindowsの場合

    rdbdmp -t E:\USERS\DEFAULT\DSI.DAT -e -y

    DSI.DATの内容を以下に示します。

    伝票管理DB.伝票表DSI1 DMP1@D:\BACKUP
    伝票管理DB.伝票IXDSI1 DMPX@D:\BACKUP

    インデックスのDSIは、ダンプレス機能および同期復元機能で、表のDSIからリカバリする場合バックアップ不要です。XMLデータのインデックスについては、表のDSIからインデックスを作成するのに、BTREE構造のインデックスと比べて時間がかかるため、インデックスのDSIの退避データを取得する運用を推奨しています。


  11. データベースの運用

    業務アプリケーションの運用を開始します。