IBM i のシングルレベルストレージのデータベース表領域管理はどうなっている?
結論:IBM i ではデータベースの表領域管理は行わない
正確には表領域という概念そのものが不要なので表領域が無い、よって管理は不要となります。以前の記事で解説したようにIBM i ではすべてのジョブ、OSやアプリケーションプログラム、データベースで全てのストレージ領域をただ一つのアドレッシングで管理しています。
一般のRDBMS(Oracle, SQL Server, Postgres, etc.)は下位レイヤーのOSからストレージ領域を切り出してもらい、それを独自管理する(これが表領域)二階建て構造になりますが、IBM i と Db2 for iは共通のシングルレベルストレージのアドレッシングしかアドレスを持ちません。さらに言えばDb2 for i はミドルウェアレイヤーではなくOS、マイクロコードレベルで実装されています。
IBM i のストレージ管理コマンド WRKSYSSTS
WRKSYSSTSコマンドを実行して、右上の方にストレージ管理に関する値が表示されます。
ここで
システムASP
システムASP使用%
はOS, データベースを含むすべてのストレージのサイズと使用率です。表領域とOSの両方でストレージの空き容量や、物理的なストレージ配置設計などに悩む必要はありません。
※ちなみに上の画像ではシステムASPのサイズ 1896GB と合計 2270GBでミスマッチです。これはシステムASP = ASP1 以外にユーザーASPか独立ASP(IASP)がこのOSにぶら下がっていることを示しています。
データベーステーブルの領域は実際どうなっている?
概念的には下図のように初期値と最大拡張可能なサイズが指定されています。(*NOMAXという制限無しも設定できる)
具体例を示すと、CRTPF時(またはCREATE TABLE時)、テーブルごとにSIZEパラメーターで初期レコード数と拡張可能な上限(レコード数と増分回数)が指定されています。
上記例のテーブル・アロケーションの解説
初期レコード数 テーブルごとの何レコードまで拡張可能かの初期値 この例では10,000
増分レコード数 上記10,000レコードに達した際、次の最大増分値の回数まで(例では3回まで)このレコード数(1,000レコード)までレコードをユーザー操作なしに拡張してくれます。
この例だと10,000レコード+ 1000レコード x 3 = 13,000 レコードまで自動的にストレージの領域を拡張してくれます。
一点、注意点は、いきなり10,000レコード分アロケートして未使用で10,000レコード分確保するのでなく、実際にストレージに書き出したレコード数分だけがデータベーステーブルのサイズになります。(ALOCATE *NOパラメーター指定)
13,001件目が追加されたらどうなる?
上記の設定で13,0001件目のレコードをかき出そうとすると*QSYSOPRシステム操作員や実行ユーザーにメッセージが通知され、上限に達したけどどうする?という問いが行われます。
さらに1,000レコード分拡張させる、処理をキャンセルする、無制限にレコードを追加OKにするなどを応答できます。
上記の例で13,001レコード目をユーザーのプログラムが追加しようとすると下記のようなメッセージが出力されます。
この例ではユーザーの5250端末から最大レコード数を拡張するか否かの応答を返します。(システム応答リストSYSRPYLに登録してユーザー操作を介在させず自動処理させる等も可能です)
テーブルレコード数の拡張時の動作やシステム応答リストSYSRPYLの設定などは別記事に説明してあります。よろしければご覧ください。
■参考:--IBM i 【温故知新】第4回「システム応答リストによるメッセージ監視とハンドリング」 iWorld