DB2のデータベース・オブジェクトと物理設計:DB2マイスター養成講座(2)(2/2 ページ)
今回は、物理設計時の前提知識として各データベース・オブジェクトを紹介し、次に物理設計におけるポイントを解説する。(編集局)
データベース作成時の検討事項
それでは、実際のプロジェクトの進行に応じて物理設計とキャパシティ・プランニングについて、前回と同様に考慮点と検討事項を解説します。
データベースを作成する際は、以下の点を考慮する必要があります。
■データベースの場所(データベース・ディレクトリ)
データベースを格納する物理的な場所(データベース・ディレクトリ)を決めます。ここには、デフォルトでデータベースを構成するすべてのオブジェクトが格納されます。デフォルトの表スペースもこのディレクトリ以下に格納されます。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数にも若干の違いがあるので注意が必要です。
コラム JDBCドライバとSun JDK
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つになります。
- 4Kbyets以外のページサイズのバッファー・プールを使いたい
- 頻繁にアクセスするマスター・テーブルがある
- データ容量が巨大なので、大きなバッファー・プールは確保できないが、インデックスはメモリに常駐させたい
バッファー・プールの構成はパフォーマンスに影響を与える部分なので、構成には注意が必要です。ただし、バッファー・プールは後で変更することも可能なので、初めは大まかに構成し、パフォーマンス・テストの段階で詳細なチューニングを行うことも可能です。
第1回でも紹介しましたが、メモリは以下の式で見積もることができます。
メモリ=DB2エンジン(256MBbytes)+バッファプール+エージェント用メモリ+DB2以外のソフトウェアが使用するメモリ
バッファー・プールの説明をしたので、この式をもう少し詳しく解説しましょう。
バッファー・プールは、以下を参考にしてください。
バッファー・プール=デフォルト・バッファープール(1)+特定テーブル用バッファー・プール(2)+大容量テーブルの索引用バッファー・プール(3)
(2)マスター・テーブルのように、頻繁に使用するテーブル用。テーブルのデータ量に合わせて見積もる
(3)索引は、(平均索引キー・サイズ+8)×レコード数×2で見積もる
エージェント用のメモリは、1接続当たり5Mbytesを目安に見積もります。同時接続数が50であれば、250Mbytes程度をエージェント用メモリとして確保します。
表スペース作成時の検討事項
■SMS表スペースかDMS表スペースか
表スペースは、まず物理的なタイプを決める必要があります。以下を参考に、SMS表スペースかDMS表スペースかを選択します。
- SMS表スペースのメリット
- ディレクトリ単位で指定するため、余分なスペースが割り振られることがない
- コンテナの事前定義が不要なため、初期作業が少ない
- DMS表スペースのメリット
- 表スペースのサイズは、コンテナの追加・削除によって変更可能
- 格納するデータタイプによって、表スペースを分割可能(LONGデータ、ログデータ、索引など)
一般的には、DMS表スペースの方がパフォーマンスに優れるため、ユーザー表スペースにはDMS表スペースを使用します。
■コンテナの配置
SMS表スペースの場合はディレクトリを指定するので難しく考える必要はありませんが、DMS表スペースの場合は物理ディスクに合わせたコンテナの配置が必要です。
コンテナの数を増やすことでディスクへのI/Oが分散されるので、パフォーマンスを向上させることもできます。
■エクステント・サイズ
データベース・マネージャから表スペースへのデータの書き出しは、エクステントと呼ばれる割当単位(ページ)に行われます。エクステント・サイズは表スペース作成時に指定するもので、後で変更することはできません。
DMS表スペースでは、エクステント・サイズを一度に割り振り、いっぱいになった時点で(コンテナが複数あれば)次のコンテナでアロケートして書き込みを行います。SMS表スペースの場合は、1ページずつ割り振ります(注)。エクステント・サイズを決める際は、以下の点に注意することが必要です。
- 急に大きくなる表に対しては、エクステントの割り振りのオーバヘッドを避けるためエクステント・サイズを大きくしておく
- 1つの表スペース内に多くの小さな表が存在する場合、少ないデータに対して大きなスペースを割り振るオーバーヘッドを避けるため、DMS表スペースであればエクステント・サイズを小さくするか、SMS表スペースを使用する
注: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プログラムを使えばアーカイブ・ログを移動できますが、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.
関連記事
- 連載:快速MySQLでデータベースアプリ!(全11回)
軽快な動作で知られるRDBMS、MySQLでDBアプリの構築を行う。MySQLのインストールに始まり、PerlやRubyなどのスクリプトでデータベースを操作する方法までを完全解説 - 連載:今から始める MySQL入門(連載中)
定番のLAMP(Linux+Apache+MySQL+PHP)構成でWebアプリケーション開発に挑戦!サンプルアプリの構築を進めながら、基礎知識や操作方法について詳しく解説する - 連載:Oracleマイスター養成講座(全6回)
本連載では、Oracleの管理・チューニング方法を紹介していく。これからOracleを始める人、そしてOracleをより深く理解したい人のための、一歩踏み込んだ実用講座 - 連載:DB2マイスター養成講座(全7回)
本連載では、DB2 UDBの実践的な運用・管理方法を紹介していく。DB2を利用するうえで必要な知識を、実運用を前提にDB2のプロが解説 - 特集:エンタープライズ市場に向かうMySQL 5.0[前編] MySQL 5.0の新機能をアルファ版でチェック
1月に公開された5.0アルファ版は大幅に拡張されており、エンタープライズ市場への進出を予感させる - 特集:Linuxで動くリレーショナルデータベース・カタログ
データベースサーバのOSとしてLinuxを採用するケースが増えている。Linuxで動作する7つの主なリレーショナルデータベースを紹介する。製品導入の際の参考にしてほしい - データベース関連記事一覧