Y社は, オフィスじゅう器メーカである。 現在, 在庫管理システムのアプリケーションプログラム (以下, AP という) の改修を実施している。
〔在庫管理システムのテーブル〕
在庫管理システムの主なテーブル構造を,図1に示す。 各テーブルには主索引が定義されている。

〔在庫管理業務の概要〕
(1) 各地の生産拠点には,組立工場と,これに隣接する倉庫がそれぞれ一つ配置されている。
(2) 倉庫からの部品の出庫には, 倉庫から隣接する組立工場に出庫する場合と,倉庫から他の生産拠点の倉庫に出庫する場合がある。
(3) 倉庫は,倉庫コードで一意に識別され,組立工場は,工場コードで一意に識別される。 生産拠点を識別するコードは存在しない。
(4) 定期便は, 倉庫間で部品を配送する便であり,便番号で一意に識別される。
(5) 部品は,部品番号で一意に識別される。
(6) 部品の在庫は, 倉庫と部品の組合せで,その数量をもつ。 倉庫内に存在する在庫を,倉庫内在庫と呼ぶ。 このうち, 隣接する組立工場又は他の生産拠点の倉庫に向けて出庫対象となったものを, 出庫対象在庫と呼ぶ。
(7) 出庫要求とは,倉庫に対して部品の出庫を要求することである。 “出庫” テーブルに出庫要求の内容が登録され, 処理状況に ‘要求発生' が記録される。 出庫番号は,出庫要求の発生順の一意な連番である。 組立工場が出庫要求する場合, 出庫先倉庫コード及び出庫便番号の値は NULL となり, 出庫先工場コードが記録される。他の生産拠点の倉庫が出庫要求する場合, 出庫先工場コードは NULL となり,出庫先倉庫コードが記録され, 出庫便番号には該当する定期便の便番号が記録される。
(8) 在庫引当とは, 出庫要求に応じて倉庫内の在庫を引き当てることである。 在庫引当 AP は,毎日の業務中に定期的に実行され, その時点で登録されている出庫要求を処理する。 指定された倉庫コード, 部品番号, 出庫数量の出庫が可能かどうかチェックし、出庫可能であれば出庫対象在庫数量を更新する。 在庫引当が完了したら,処理状況は ‘引当実施' に更新される。
(9) 出庫とは, 出庫要求に従って, 倉庫から部品を出すことである。 出庫は多頻度で行われるので, 出庫ごとに在庫は更新されず, 出庫確定 AP でまとめて更新される。
(10) 出庫確定 AP は、 毎日の業務終了時に実行される。 “出庫” テーブルの処理状況が ‘引当実施' のものを対象に, 倉庫内在庫数量及び出庫対象在庫数量が更新され,処理が完了したら, 処理状況は ‘出庫実施’に更新される。
(11) 入庫とは,他の生産拠点の倉庫で出庫された部品を倉庫に入れることである。入庫による在庫の更新は,在庫引当 AP 及び出庫確定 AP と同時に実行されることはない。
〔RDBMS の排他制御〕
(1) 在庫管理システムの RDBMS で選択できるトランザクションの ISOLATION レベルとその排他制御は,表1のとおりである。
ロックは行単位で掛ける。 共有ロックが掛かっている間, 他のトランザクションからの対象行の参照は可能であり,更新は共有ロックの解放待ちとなる。 専有ロックが掛かっている間, 他のトランザクションからの対象行の参照, 更新は専有ロックの解放待ちとなる。
(2) 索引を使わずに, テーブルスキャンで全ての行に順次アクセスする場合, 検索条件に合致するか否かにかかわらず全行がロック対象となる。 索引スキャンの場合,索引から読み込んだ行だけがロック対象となる。
〔分析機能の追加〕
適切な生産計画を立てるために, 部品ごとに在庫数量, 出庫数量の日別の推移状況を見たいという要望があり,そのための集計 AP を追加した。 集計 AP で実行するSQL の一部を, 表2に示す。 SQL1 は各部品の出庫年月日ごとの出庫数量を集計する。
また, SQL1 では、 出庫が全くない部品も集計対象とする。 SQL2 は, 各部品の倉庫間の出庫について, 出庫年月日,出庫元倉庫, 出庫先倉庫ごとに出庫数量を集計する。表2 集計 AP で実行する SQL の構文 (未完成)
〔在庫引当 AP の改修〕
在庫管理システムでは, トランザクションの ISOLATION レベルを REPEATABLEREAD として設計, 運用していた。 システムの改修に当たり,在庫引当 AP のトランザクションの ISOLATION レベルを READ COMMITTED に変更することにした。ISOLATION レベルの変更で問題が発生しないように在庫引当AP を改修した。
改修前の在庫引当 AP は図 2, 改修後の在庫引当AP は図3のとおりである。 これらの AP の実行に先立って, “出庫” テーブルの処理状況が ‘要求発生' の行を抽出し、出庫先倉庫ごとに分割したファイルを作成する。 それぞれのファイルのレコードは,出庫番号順に記録されている。 作成したファイルを入力として, 在庫引当 AP を並列実行している。 在庫引当 AP は, 入力ファイルのレコードごとに繰り返し実行される。
なお,図 2,3中のホスト変数 hv0 は出庫番号, hv1 は出庫元倉庫コード, hv2 は部品番号, hv3 は出庫数量を表す。 hv4 と hv5 は, 検索結果を返す出力ホスト変数を表す。

〔出庫確定 APの改修 〕
出庫確定 AP の処理に掛かる時間を短縮するために, 出庫確定 AP を並列に多重プロセスで実行するように変更することにした。 “出庫” テーブルの出庫番号の値の範囲指定で各プロセスに均等に配分して, REPEATABLE READ で並列実行する。 出庫確定 AP の概要は,図4のとおりである。