それでは、実際のプロジェクトの進行に応じて物理設計とキャパシティ・プランニングについて、前回と同様に考慮点と検討事項を解説します。
データベースを作成する際は、以下の点を考慮する必要があります。
データベースを格納する物理的な場所(データベース・ディレクトリ)を決めます。ここには、デフォルトでデータベースを構成するすべてのオブジェクトが格納されます。デフォルトの表スペースもこのディレクトリ以下に格納されます。I/Oの速度が速く、運用しやすい(注)ディレクトリを指定します。
注:例えば、OSと異なるドライブ/パーティションを使うことで、OSを再インストールしなければならない事態になっても、データベースを残すことができます。
データベースが使用する文字コードと国を指定します。データベース作成後には変更できないので、注意が必要です。
Linuxでは、デフォルトでシェルの環境変数LANGを参照して文字コードが決められるので、日本語のLinux環境ではコードセットが「IBM-eucJP」、テリトリが「JP」というデータベースが作成されます。日本語であれば、IBM-eucJP、IBM-943(シフトJIS)、UTF-8が一般的です。コードセットの違いはDB2のクライアントが変換することで吸収されるので、IBM-eucJPで問題ありません。
ただし、XMLやWebサービス関連の関数を使用する場合は、IBM-eucJPでは不具合のあるものもあるので、IBM-943かUTF-8をお勧めします(FixPak3時点)。また、日本語を格納するbyte数にも若干の違いがあるので注意が必要です。
DB2 UDB V8.1からJDBCドライバが新しくなっています。このJDBCドライバを使う際にも、データベースのコードセットに注意が必要です。SunのJDKを使うと、IBM-943が変換できずエラーになります(Linuxの場合、SunのJDKはDB2ではサポート外)。Tomcatなどでは、特に要注意です。DB2に付属するIBMのJDKを使う場合は問題ありません。
前述のコードセットと同様、データベース作成後には変更できないので注意が必要です。デフォルトでは、テリトリ(国)に基づくソート順序「SYSTEM」が適用されます。これ以外に、byte単位で比較ソートする「IDENTITY」やDB2 V2の方式の「COMPATIBILITY」が選択できます。特別な理由がない限り、通常はデフォルトのSYSTEMを使用します。
$ db2 create database test on /db2data using codeset UTF-8 territory JP collate using SYSTEM
デフォルトでは約100Mbytes(4Kbytes×1000ページ)割り振られますが、これでは小さいのでデータベース作成後に必ず増やします。
$ db2 'select substr(bpname, 1, 20) as bpname, npages, pagesize from syscat.bufferpools' BPNAME NPAGES PAGESIZE -------------------- ----------- ----------- IBMDEFAULTBP 1000 4096
$ db2 ALTER BUFFERPOOL IBMDEFAULTBP IMMEDIATE SIZE 2000
$ db2 CREATE BUFFERPOOL BUFFERPOOL8 SIZE 500 PAGESIZE 8K
複数のバッファー・プールを持つことができる点も考慮しましょう。
また、以下の場合は専用のバッファー・プールを作成することも選択肢の1つになります。
バッファー・プールの構成はパフォーマンスに影響を与える部分なので、構成には注意が必要です。ただし、バッファー・プールは後で変更することも可能なので、初めは大まかに構成し、パフォーマンス・テストの段階で詳細なチューニングを行うことも可能です。
第1回でも紹介しましたが、メモリは以下の式で見積もることができます。
メモリ=DB2エンジン(256MBbytes)+バッファプール+エージェント用メモリ+DB2以外のソフトウェアが使用するメモリ
バッファー・プールの説明をしたので、この式をもう少し詳しく解説しましょう。
バッファー・プールは、以下を参考にしてください。
バッファー・プール=デフォルト・バッファープール(1)+特定テーブル用バッファー・プール(2)+大容量テーブルの索引用バッファー・プール(3)
エージェント用のメモリは、1接続当たり5Mbytesを目安に見積もります。同時接続数が50であれば、250Mbytes程度をエージェント用メモリとして確保します。
表スペースは、まず物理的なタイプを決める必要があります。以下を参考に、SMS表スペースかDMS表スペースかを選択します。
一般的には、DMS表スペースの方がパフォーマンスに優れるため、ユーザー表スペースにはDMS表スペースを使用します。
SMS表スペースの場合はディレクトリを指定するので難しく考える必要はありませんが、DMS表スペースの場合は物理ディスクに合わせたコンテナの配置が必要です。
コンテナの数を増やすことでディスクへのI/Oが分散されるので、パフォーマンスを向上させることもできます。
データベース・マネージャから表スペースへのデータの書き出しは、エクステントと呼ばれる割当単位(ページ)に行われます。エクステント・サイズは表スペース作成時に指定するもので、後で変更することはできません。
DMS表スペースでは、エクステント・サイズを一度に割り振り、いっぱいになった時点で(コンテナが複数あれば)次のコンテナでアロケートして書き込みを行います。SMS表スペースの場合は、1ページずつ割り振ります(注)。エクステント・サイズを決める際は、以下の点に注意することが必要です。
注:db2empfaユーティリティを使えば、SMS表スペースでもエクステント・サイズを一度に割り振ることが可能です。
表スペースは、特定の1つのバッファー・プールを使用します。デフォルトのバッファー・プール(IBMDEFAULTBP)以外のバッファー・プールを使用する場合は、必要なバッファー・プールを作成し、表スペース作成時にそのバッファー・プールに関連付けます。
$ db2 "CREATE TABLESPACE USERSPACE8 PAGESIZE 8K \ MANAGED BY DATABASE \ USING (FILE '/db2data/db2inst1/NODE0000/SQL00001/TS8.TS' 10000) \ BUFFERPOOL BUFFERPOOL8"
更新のない、参照だけのデータベースであればログを保存する必要もないので循環ログ方式で十分です。しかし、ほとんどの場合は更新を伴うためログを保存し、データベースが壊れた際は、バックアップイメージと保存したログ(アーカイブ・ログ)を使ってデータベースをリカバリしなければなりません。
デフォルトでは循環ログ方式なので、必要に応じてデータベース構成パラメータを変更します。
$ db2 update database config for test using LOGRETAIN ON
データベース構成パラメータのNEWLOGPATHを使って、アクティブ・ログの場所を変更することができます。デフォルトではデータベース・ディレクトリ以下に作成されますが、ディスクI/Oなどを考慮して、別のパーティションに移すことも可能です。
$ db2 update database config for test using NEWLOGPATH /db2log
クローズされたアーカイブ・ログを、アクティブ・ログとは別の場所に保存することができます。可用性の観点から、アーカイブ・ログの保存場所を変えることでDB2の状態にかかわらずアーカイブ・ログのバックアップを可能にします。
$ db2 update database config for test using USEREXIT ON
USEREXITプログラムを使えばアーカイブ・ログを移動できますが、USEREXITプログラムはサンプルしか提供されていないので、コンパイルする必要があります。
$INSTANCE_HOME/sqllib/samples/c以下に、4つのサンプルが用意されています。ディスクに保存する場合はdb2uext2.cdiskを使います。
$ cp ~/sqllib/samples/c/db2uext2.cdisk ./tmp/db2uext2.c $ cd tmp $ chmod +w db2uext2.c $ vi db2uext2.c
$ gcc -D_INCLUDE_POSIX_SOURCE db2uext2.c -o db2uext2 $ cp db2uext2 ~/sqllib/adm/
これでUSEREXITプログラムが利用可能になります。
以上、データベースの物理構成を行う際に考慮すべき点を検討しました。次回は、アプリケーションの開発について、特にWebアプリケーションの開発を中心に解説します。
Copyright © ITmedia, Inc. All Rights Reserved.