令和7年度 秋期 データベーススペシャリスト試験 午後I 問題 問3 在庫管理システムのSQLと排他制御の改修

テクノロジデータベースシステム構成

この問題は2025(R7)秋 データベーススペシャリスト 午後Iに出題されたものです。出題時点の法令・制度に基づく内容のため、現行の内容と一致しない場合があります。

本ページの問題文・選択肢は、原本の体裁を Web 表示用に正規化しています(改行・記号・数式・図表参照の調整)。設問の趣旨および正解に影響する変更は加えていません。

学習ガイド

オフィス什器メーカーの在庫管理システム改修を題材に、SQL設計と排他制御を問う問題です。在庫履歴を分析するSQLの空欄補充に始まり、在庫引当アプリの処理順とロックの関係から引当数量の不正が生じる条件を特定する設問、索引の見直しまで、稼働中システムに手を入れる際の設計上の注意が凝縮されています。この記事では、処理の並行実行を時系列で書き出し、不正の発生条件を自力で再現できる形に解きほぐします。

この記事で押さえる論点

  • ウィンドウ関数を含む在庫履歴SQLの空欄を埋める
  • 在庫引当処理のロック範囲から不正が起きる条件を特定する
  • 索引の見直しによる性能改善の根拠を説明する

問題本文

オフィスじゅう器メーカーの在庫管理システムのデータベース実装に関する次の記述を読んで,設問に答えよ。

オフィスじゅう器メーカーのY社は,RDBMSを用いた在庫管理システムを稼働させてから10年が経ち,システム更改を予定している。そこで,Kさんが改善点の検討を任された。

〔RDBMSの主な仕様〕

  1. アクセス経路
    (1) アクセス経路は,RDBMSによって表探索又は索引探索に決められる。表探索では,索引を使わずに先頭ページから順に全行を読み込む。索引探索では,索引によって絞り込んでから表の行を読み込む。
    (2) 索引探索を選択するためには,WHERE句又はON句のANDだけで結ばれた一つ以上の等値比較の述語の対象列が,索引キーの全体又は先頭から連続した一つ以上の列に一致していなければならない。
    (3) 索引探索のとき,SELECT文で取得対象とする列と,探索条件で絞込みに利用する列が,索引キーに全て含まれている場合は,表の行を読み込まずに,索引へのアクセスだけで結果を返す。

  2. 排他制御
    (1) 排他制御では行単位で共有ロック又は専有ロックを取得する。共有ロックを取得している間,他のトランザクションから対象行への共有ロックの取得は可能であり,専有ロックの取得は共有ロックの解放待ちとなる。専有ロックを取得している間,他のトランザクションから対象行への共有ロック及び専有ロックの取得は,専有ロックの解放待ちとなる。
    (2) アクセス経路に従って,探索した行をロックの対象とする。
    (3) SELECT文にFOR UPDATE句を指定すると,ISOLATIONレベルにかかわらず,対象行の専有ロックを取得し,トランザクション終了時に解放する。

  3. 時刻印型の列
    (1) テーブル定義で,時刻印型の列(以下,TS列という)のDEFAULT句にCURRENT_TIMESTAMPを指定することで,行が挿入されたとき,TS列に現在時刻印を自動的に設定することができる。
    (2) 行が更新されたときにTS列をCURRENT_TIMESTAMPで更新するトリガーを定義することで,TS列を現在時刻印で自動的に更新することができる。

〔在庫管理システムの概要〕

  1. テーブル構造
    主なテーブルのテーブル構造を図1に示す。主キーには主索引が定義されている。
図1 主なテーブルのテーブル構造
図の説明テキスト

以下のテーブルスキーマが定義されている。
倉庫 (倉庫コード, 倉庫名)
部品 (部品番号, 部品名, 部品単価)
在庫 (倉庫コード, 部品番号, 在庫数量, 引当済在庫数量, 最終更新TS)
出庫 (出庫番号, 出庫年月日, 出庫倉庫コード, 部品番号, 出庫数量, 処理状況, 最終更新TS)
入庫 (入庫番号, 入庫年月日, 入庫倉庫コード, 部品番号, 入庫数量, 最終更新TS)
(主キーには実線の下線、外部キーには破線の下線が付与されている)
注記1 年月日を示す列のデータ型は,日付型とする。
注記2 最終更新TS列は,挿入・更新時の現在時刻印で自動的に更新されるTS列とする。

  1. 業務の概要
    (1) 各地の生産拠点には,組立工場と,これに隣接する倉庫がある。
    (2) 倉庫からの部品の出庫には,倉庫から隣接する組立工場に出庫する場合と,倉庫から他の生産拠点の倉庫に出庫する場合がある。
    (3) 倉庫は,倉庫コードで識別する。部品は,部品番号で識別する。
    (4) 部品の在庫は,倉庫と部品の組合せで管理する。倉庫内に存在する在庫の数量を在庫数量と呼ぶ。このうち,出庫対象として引き当てた数量を,引当済在庫数量と呼ぶ。また,在庫数量から引当済在庫数量を引いた数量を,出庫可能在庫数量と呼ぶ。
    (5) 部品の出庫は,出庫要求,在庫引当,出庫,在庫反映の流れで,それぞれのアプリケーションプログラム(以下,APという)を用いて処理し,“出庫”テーブルに処理状況を記録する。
  • 出庫要求とは,部品の出庫要求を受け付けて,“出庫”テーブルに行を追加する処理である。処理状況を‘要求発生’にする。
  • 在庫引当とは,出庫要求に応じて倉庫内の在庫を引き当てる処理である。指定された倉庫コード,部品番号,出庫数量の出庫が可能かどうかチェックし,出庫が可能であれば“在庫”テーブルの引当済在庫数量を更新し,処理状況を‘引当実施’にする。
  • 出庫とは,倉庫から在庫の引当ができた部品を出す処理である。処理状況を‘出庫済’にする。
  • 在庫反映とは,処理状況が‘出庫済’の全ての出庫を対象に,“在庫”テーブルの在庫数量及び引当済在庫数量から引き落として,処理状況を‘在庫反映済’にする一括処理である。“在庫反映”APは,毎日の業務終了時に実行する。
    (6) 入庫とは,部品メーカーから納品された,又は他の生産拠点の倉庫から出庫された部品を倉庫に入れることである。運ばれてきた部品を倉庫内の集積所に蓄積し,当日の入庫予定分がそろったら順に入庫を処理し,在庫を更新する。入庫による在庫の更新は,在庫反映と同時に実施しない。

〔在庫履歴分析手段の見直し〕

日別の在庫数量を集計するAPを用いて,在庫数量の日別の推移状況を分析している。このAPでは,“在庫”,“出庫”及び“入庫”テーブルを参照して,在庫数量を集計しており,データ量の増加に伴って処理時間が長くなっていた。この対策として,図2に示す“在庫履歴”テーブルを作成して,在庫数量の推移を蓄積していくことにした。

図2 “在庫履歴”テーブルのテーブル構造
図の説明テキスト

在庫履歴テーブルの構造を示す図。
在庫履歴 (倉庫コード, 部品番号, 履歴年月日, 在庫数量)
注記 年月日を示す列のデータ型は, 日付型とする。
(※倉庫コード、部品番号、履歴年月日の3項目には主キーを示す実線下線が引かれている)

Kさんは,“在庫”,“出庫”及び“入庫”テーブルからこれまでの在庫履歴を作成する方法を検討した。
全ての倉庫の全ての部品について,在庫履歴を作成する初日時点の在庫数量の行をあらかじめ作成しておき,在庫履歴を蓄積する年月日分繰り返し実行するSQL1を設計した。
また,区間数7の中央移動平均のグラフを作成したいとの要望があった。区間数7の中央移動平均は,ある年月日とその前後3日間の計7日間の平均値である。計7日間のデータがそろわない期間は対象外である。Kさんは,作成した在庫履歴のデータから区間数7の中央移動平均用データを加工するSQL2を設計した。

設計したSQL文を,表1に示す。

表1 在庫履歴用のSQL文(未完成)
図の説明テキスト
SQL SQL文の構文(上段: 目的, 下段: 構文)
SQL1 全ての倉庫の全ての部品について, 指定した年月日の業務終了時点の在庫数量を算出する。
INSERT INTO 在庫履歴(倉庫コード, 部品番号, 履歴年月日, 在庫数量)
WITH 前日在庫 AS (
SELECT 倉庫コード, 部品番号, 履歴年月日, 在庫数量
FROM 在庫履歴
WHERE 履歴年月日 = PREVIOUS_DAY(:hv1)),
出庫状況 AS (
SELECT 出庫倉庫コード, 部品番号, 出庫年月日, a AS 当日出庫数量
FROM 出庫
WHERE 出庫年月日 = CAST(:hv1 AS DATE) AND 処理状況 = '在庫反映済'
GROUP BY 出庫倉庫コード, 部品番号, 出庫年月日),
入庫状況 AS (
SELECT 入庫倉庫コード, 部品番号, 入庫年月日, b AS 当日入庫数量
FROM 入庫
WHERE 入庫年月日 = CAST(:hv1 AS DATE)
GROUP BY 入庫倉庫コード, 部品番号, 入庫年月日)
SELECT A.倉庫コード, A.部品番号, CAST(:hv1 AS DATE),
A.在庫数量 - COALESCE(c, 0) + COALESCE(d, 0) AS 在庫数量
FROM 前日在庫 A
LEFT OUTER JOIN 出庫状況 B ON A.倉庫コード = B.出庫倉庫コード
AND A.部品番号 = B.部品番号
LEFT OUTER JOIN 入庫状況 C ON A.倉庫コード = C.入庫倉庫コード
AND A.部品番号 = C.部品番号
SQL2 在庫履歴の倉庫コードごと部品番号ごとに, 在庫数量の区間数7の中央移動平均を算出する。
SELECT 倉庫コード, 部品番号, 履歴年月日,
CASE WHEN (COUNT(*) OVER 移動平均区間) = 7
THEN CAST(( e OVER 移動平均区間) AS INTEGER)
ELSE NULL END AS 中央移動平均
FROM 在庫履歴
WINDOW 移動平均区間 AS (
PARTITION BY f ORDER BY g
ROWS BETWEEN h PRECEDING AND i FOLLOWING)

注記1 ホスト変数hv1には, 年月日を設定する。
注記2 PREVIOUS_DAY(引数)は, 引数(文字型)に指定された日付の前日(日付型)を返すユーザー定義関数である。
注記3 WINDOW句は, ウィンドウ関数のウィンドウを定義して名前を付ける。OVER句の後に名前を指定して参照する。

〔トランザクションの排他制御の見直し〕

既存システムの実行ログを分析すると,複数の“在庫引当”APが,“在庫”テーブルの同じ行に対して同時実行されたときに,デッドロックによってAPのリトライが発生していることが判明した。“在庫引当”APの処理の流れとSQL文を図3に示す。
ISOLATIONレベルはREPEATABLE READで実行している。

図3 “在庫引当”APの処理の流れとSQL文
図の説明テキスト

① SELECT 在庫数量, 引当済在庫数量 INTO :hv5, :hv6 FROM 在庫
WHERE 倉庫コード = :hv2 AND 部品番号 = :hv3
出庫可能在庫数量(hv5 - hv6)と hv4 を比較し,出庫が可能な場合だけ以降を実行する。
② UPDATE 在庫 SET 引当済在庫数量 = 引当済在庫数量 + :hv4
WHERE 倉庫コード = :hv2 AND 部品番号 = :hv3
③ UPDATE 出庫 SET 処理状況 = '引当実施' WHERE 出庫番号 = :hv1
④ COMMIT

注記 ホスト変数 hv1, hv2, hv3, hv4 には,それぞれ出庫番号,出庫倉庫コード,部品番号,要求する出庫数量を設定する。ホスト変数 hv5 と hv6 には,それぞれ在庫数量,引当済在庫数量の検索結果を返す。

Kさんはデッドロックの原因を調査し,上司であるL氏と対応について議論した。

L氏:デッドロックの原因は何でしょうか。
Kさん:ある“在庫引当”APが j で共有ロックを取得した後, k で専有ロックを取得し直す前に,別の“在庫引当”APが j で共有ロックを取得してしまい,互いに専有ロックを取得しようとしてロックの解放待ちになっていました。
L氏:どのような改善案がありますか。
Kさん:“在庫”テーブルの同じ行に対して,“在庫引当”APが同時実行されないように最終更新TS列で制御する案があります。“在庫引当”APを次のように変更します。①のSELECT文で l するように変更し,①の後にCOMMIT文を追加します。②のUPDATE文のWHERE句に, m ことを条件として追加します。②の後に,②のUPDATE文で該当する行がなかったら, n に戻る制御を追加します。
L氏:その案ではAPの大幅な変更が必要になります。変更を最小限にとどめる方法はありますか。

Kさん:ISOLATIONレベルをREAD COMMITTEDに変更して,jの共有ロックがすぐに解放されるようにする案もあります。

L氏 :単純にREAD COMMITTEDに変更すると,引当済在庫数量が不正になってしまうおそれがあります。同じ倉庫の同じ部品に対して,“在庫引当”APが複数同時に実行されるとき,それぞれの要求する出庫数量の合計が,oしていると,引当済在庫数量が不正になってしまいます。ISOLATIONレベルを変更しない方法はありますか。

Kさん:①のSELECT文に,pする案があります。

〔索引の見直し〕

毎日の業務終了時に実行される“在庫反映”APの処理時間の短縮要望を受け,Kさんが対策を検討した。その結果,出庫倉庫コードと部品番号の組合せの値の範囲で分割し,分割した値の範囲それぞれを各プロセスに配分して並列実行するように変更することにした。変更後の“在庫反映”APの処理の流れを図4に示す。ISOLATIONレベルはREPEATABLE READで実行する。

図4 変更後の“在庫反映”APの処理の流れ
図の説明テキスト
  1. “出庫”テーブルに登録されている,指定された範囲内の,出庫倉庫コードと部品番号の組合せの値の昇順に,行ごとに次の2の処理を行う。
  2. “出庫”テーブルを参照して,処理要否を判定する。処理状況が‘出庫済’の場合だけ次の2-1〜2-3を実行する。
     2-1. “在庫”テーブルの在庫数量を更新(出庫数量分を減算)する。
     2-2. “在庫”テーブルの引当済在庫数量を更新(出庫数量分を減算)する。
     2-3. “出庫”テーブルの処理状況を‘在庫反映済’に更新する。
  3. “出庫”テーブルの指定された範囲内の全ての行の処理が完了したら,COMMITする。

これを確認したL氏は,索引の見直しを指示した。

L氏 :“q”テーブルのr列とs列の組合せをこの順で索引キーとする複数列索引を定義しておく必要があります。この索引を定義していないと,自プロセスの対象行かどうかを判定するための参照が表探索となります。その場合,他APがtした行を参照しようとしてuが生じた結果,処理時間が長くなるおそれがあります。デッドロックが発生しないかの検証も必要です。

Kさん:処理要否の判定も,表の行の読込みを不要にして性能を向上させるために,“q”テーブルのv列もこの複数列索引の索引キーに加えてもよいでしょうか。
L氏:そのメリットと,そうすることで“q”テーブルを更新するAPが,索引の更新頻度の増加によって性能が低下するデメリットとのトレードオフを検証してください。

設問と解答・解説

設問1

(1)

表1中のaに入れる適切な字句又は数値を答えよ。

模範解答

SUM(出庫数量)

採点基準(配点 2点)

正確性(内容)(2点)

  • 2: 「SUM(出庫数量)」と正しく解答できている。
  • 1: 出庫数量の集計であることは理解できるが、関数の記述に軽微な誤りがある。
  • 0: 無解答、または全く異なる内容を記述している。

解説

在庫履歴を分析するために、出庫数量の合計などを算出するSQLの空欄補充です。SQL1で GROUP BY を使って集計を行っていると推測され、「a」は出庫数量の合計を求めるため SUM(出庫数量) が適切です。

高得点のポイント

  • 出庫数量の合計を求めるために SUM 関数を使用していること。

(2)

表1中のbに入れる適切な字句又は数値を答えよ。

模範解答

SUM(入庫数量)

採点基準(配点 2点)

正確性(内容)(2点)

  • 2: 「SUM(入庫数量)」と正しく解答できている。
  • 1: 入庫数量の集計であることは理解できるが、関数の記述に軽微な誤りがある。
  • 0: 無解答、または全く異なる内容を記述している。

解説

在庫履歴を分析するためのSQLの空欄補充です。出庫数量と同様に、入庫数量の合計を求めるため「b」には SUM(入庫数量) が入ります。

高得点のポイント

  • 入庫数量の合計を求めるために SUM 関数を使用していること。

(3)

表1中のcに入れる適切な字句又は数値を答えよ。

模範解答

当日出庫数量

採点基準(配点 2点)

正確性(内容)(2点)

  • 2: 「当日出庫数量」と正しく解答できている。
  • 1: 出庫に関する数量であることは理解できているが、字句に軽微な誤りがある。
  • 0: 無解答、または全く異なる内容を記述している。

解説

当日の在庫を算出する式の一部です。前日の在庫数量から、当日の出庫分を引き、入庫分を足すことで当日の在庫が求まります。したがって「c」には減算される 当日出庫数量 が該当します。

高得点のポイント

  • 在庫数量の算出式において、減算される項目が「当日出庫数量」であることを明記していること。

(4)

表1中のdに入れる適切な字句又は数値を答えよ。

模範解答

当日入庫数量

採点基準(配点 2点)

正確性(内容)(2点)

  • 2: 「当日入庫数量」と正しく解答できている。
  • 1: 入庫に関する数量であることは理解できているが、字句に軽微な誤りがある。
  • 0: 無解答、または全く異なる内容を記述している。

解説

当日の在庫を算出する式の一部です。前日在庫に加算される項目は当日の入庫分となるため、「d」には 当日入庫数量 が該当します。

高得点のポイント

  • 在庫数量の算出式において、加算される項目が「当日入庫数量」であることを明記していること。

(5)

表1中のeに入れる適切な字句又は数値を答えよ。

模範解答

AVG(在庫数量)

採点基準(配点 2点)

正確性(内容)(2点)

  • 2: 「AVG(在庫数量)」と正しく解答できている。
  • 1: 平均を求める意図は読み取れるが、関数の記述に軽微な誤りがある。
  • 0: 無解答、または全く異なる内容を記述している。

解説

在庫数量の移動平均などを算出するため、平均値を求める集計関数が必要です。平均値を求めるには AVG 関数を使用するため、「e」には AVG(在庫数量) が入ります。

高得点のポイント

  • 平均値を算出する AVG 関数を正しく使用していること。

(6)

表1中のfに入れる適切な字句又は数値を答えよ。

模範解答

倉庫コード, 部品番号

採点基準(配点 2点)

正確性(内容)(2点)

  • 2: 「倉庫コード, 部品番号」と正しく解答できている。
  • 1: いずれか片方のみ解答している、または列名に軽微な誤りがある。
  • 0: 無解答、または全く異なる内容を記述している。

解説

分析の単位として、在庫数量は倉庫ごと、および部品ごとに集計されます。そのため、集計のグループ化(PARTITION BY 句など)には 倉庫コード, 部品番号 が指定されます。

高得点のポイント

  • 集計の単位となる「倉庫コード」と「部品番号」の両方を正しく列挙していること。

(7)

表1中のgに入れる適切な字句又は数値を答えよ。

模範解答

履歴年月日

採点基準(配点 2点)

正確性(内容)(2点)

  • 2: 「履歴年月日」と正しく解答できている。
  • 1: 日付に関する列であることは理解できているが、字句に誤りがある。
  • 0: 無解答、または全く異なる内容を記述している。

解説

時系列データの移動平均を算出するためには、データを日付順に並べる必要があります。したがって、ORDER BY 句などの並び替えの基準には 履歴年月日 を指定します。

高得点のポイント

  • 時系列のソート順として「履歴年月日」を指定していること。

(8)

表1中のhに入れる適切な字句又は数値を答えよ。

模範解答

3

採点基準(配点 2点)

正確性(内容)(2点)

  • 2: 「3」と正しく解答できている。
  • 1: 数値が異なるが、前後の範囲指定である意図は読み取れる。
  • 0: 無解答、または全く異なる内容を記述している。

解説

7日間の中央移動平均を求める際、当日を含めて前後何日分を対象にするかを指定します。対象期間は「前3日 + 当日(1日) + 後3日 = 計7日」となるため、PRECEDING(前)の指定には 3 が入ります。

高得点のポイント

  • 中央移動平均の計算範囲として前方に3日を指定していること。

(9)

表1中のiに入れる適切な字句又は数値を答えよ。

模範解答

3

採点基準(配点 2点)

正確性(内容)(2点)

  • 2: 「3」と正しく解答できている。
  • 1: 数値が異なるが、前後の範囲指定である意図は読み取れる。
  • 0: 無解答、または全く異なる内容を記述している。

解説

7日間の中央移動平均を求める際、後方の対象期間を指定します。「前3日 + 当日(1日) + 後3日 = 計7日」となるため、FOLLOWING(後)の指定にも 3 が入ります。

高得点のポイント

  • 中央移動平均の計算範囲として後方に3日を指定していること。

(10)

表1中のSQL2の下線アについて,CASE式のELSE句で中央移動平均をNULLにする理由を25字以内で答えよ。

模範解答

計7日間のデータがそろわない期間は対象外だから

採点基準(配点 2点)

知識・理解度(内容)(1点)

  • 1: 7日間のデータが揃わない期間であることを正しく理解し記述できている。
  • 0: データが揃わない点について言及されていない。

論理性(構造)(1点)

  • 1: 理由として論理的につながる自然な文脈で記述されている。
  • 0: 文脈が不自然、または問いに対する理由になっていない。

解説

7日間の中央移動平均を計算する際、最初や最後の数日は前後3日分のデータが存在せず、7日分のデータが揃いません。そのため、不完全なデータでの平均値算出を避け、移動平均を NULL にする処理が行われます。

高得点のポイント

  • 対象期間(計7日間)のデータが不足している期間であることを明示していること。
  • その期間は計算対象外とする論理が簡潔に述べられていること。

設問1では,(1)eの正答率が低かった。平均値を求める集計関数を答えられない受験者が多かった。基本的な集計関数については用途を把握しておいてもらいたい。

設問2

(1)

本文中のjに入れる適切な数字を,図3中の①〜④の中から選んで答えよ。

模範解答

選択肢ア: ①

配点 1

解説

時刻印(タイムスタンプ)を用いた楽観的ロックの実装に関する設問です。処理の最初の段階で対象データを取得するステップが該当するため、図3中の が適切です。

各選択肢の解説

  • ① (ア): 正答。データの取得ステップを表します。
  • ② (イ): 取得後の別の処理ステップであり、最初の取得には該当しません。
  • ③ (ウ): 更新前チェックや更新処理のステップであり誤りです。
  • ④ (エ): 更新後の確認や後処理ステップであり誤りです。

(2)

本文中のkに入れる適切な数字を,図3中の①〜④の中から選んで答えよ。

模範解答

選択肢イ: ②

配点 1

解説

時刻印(タイムスタンプ)を用いた楽観的ロックの実装に関する設問です。最初のデータ取得後、後続のチェックや処理のステップを表すため、図3中の が該当します。

各選択肢の解説

  • ① (ア): データ取得ステップであり、この空欄には該当しません。
  • ② (イ): 正答。データの取得に続く適切な処理ステップを表します。
  • ③ (ウ): 後続の更新処理などであり誤りです。
  • ④ (エ): 処理の最終段階であり誤りです。

(3)

本文中のlに入れる適切な字句を答えよ。

模範解答

最終更新TS列の値も取得

採点基準(配点 3点)

正確性(内容)(3点)

  • 3: 「最終更新TS列の値も取得」と同等の内容が正確に記述されている。
  • 1: タイムスタンプの取得に言及しているが、表現が不正確あるいは曖昧である。
  • 0: 無解答、または全く異なる内容を記述している。

解説

時刻印(タイムスタンプ)を用いた同時実行制御では、更新の衝突を検知するために、データを読み込む際に検索対象のデータに加えて 最終更新TS列の値も取得 しておく必要があります。

高得点のポイント

  • データの取得時に、最終更新のタイムスタンプ(TS列)も併せて取得することを明記していること。

(4)

本文中のmに入れる適切な字句を答えよ。

模範解答

最終更新TS列が①で取得した値と一致する

採点基準(配点 3点)

正確性(内容)(3点)

  • 3: 取得したTS列の値と一致することを正確に記述している。
  • 1: 一致確認の意図は読み取れるが、表現に曖昧さや不足がある。
  • 0: 無解答、または全く異なる内容を記述している。

解説

楽観的ロックでデータを更新する際、他のトランザクションによる割り込み更新がなかったかを確認するため、更新条件(WHERE 句など)で 最終更新TS列が①で取得した値と一致する ことをチェックする必要があります。

高得点のポイント

  • 更新時の条件として、現在の最終更新TS列の値が、取得時の値と一致していることを明記していること。

(5)

本文中のnに入れる適切な数字を,図3中の①〜④の中から選んで答えよ。

模範解答

選択肢ア: ①

配点 1

解説

処理の流れや結果の判定ステップを示す設問です。図3中の が適切に文脈と一致します。

各選択肢の解説

  • ① (ア): 正答。該当する処理フローのステップを表します。
  • ② (イ): 異なる処理ステップであり誤りです。
  • ③ (ウ): 異なる処理ステップであり誤りです。
  • ④ (エ): 異なる処理ステップであり誤りです。

(6)

本文中のoに入れる引当済在庫数量の不正を引き起こす条件を答えよ。

模範解答

出庫可能在庫数量を超過

採点基準(配点 3点)

正確性(内容)(3点)

  • 3: 「出庫可能在庫数量を超過」と同等の内容が正確に記述されている。
  • 1: 在庫の超過について言及しているが、正確な項目名などが不足している。
  • 0: 無解答、または全く異なる内容を記述している。

解説

引当済在庫数量の不正を引き起こす条件についての設問です。在庫引当を行う際、出庫指示数量が「出庫可能在庫数量」を超過していると、在庫がマイナスになるなどの不正が生じます。

高得点のポイント

  • 出庫数量(指示数量)が出庫可能な在庫数を超過している状態を明確に記述していること。

(7)

本文中のpに入れる適切な変更内容を答えよ。

模範解答

FOR UPDATE句を指定

採点基準(配点 3点)

正確性(内容)(3点)

  • 3: 「FOR UPDATE句を指定」と同等の内容が正確に記述されている。
  • 1: 排他ロックの取得に関する記述はあるが、「FOR UPDATE」などの具体的なSQL構文が不足している。
  • 0: 無解答、または全く異なる内容を記述している。

解説

排他制御の見直しにおいて、悲観的ロックを適切に実装するための変更内容です。対象の行を更新目的でロックするには、SELECT 文に FOR UPDATE 句を指定 して行ロックを確保する必要があります。

高得点のポイント

  • SELECT 文に対して FOR UPDATE 句を指定することを明記していること。

設問2では,(2)l,mの正答率が低かった。時刻印を用いた同時実行制御を実際の処理に落とし込む問題であるが,複雑な処理ではないので,具体的なロジックを想定すれば解答できたはずである。

設問3

〔索引の見直し〕について答えよ。

(1)

本文中のqに入れる適切な字句を答えよ。

模範解答

出庫

採点基準(配点 2点)

正確性(内容)(2点)

  • 2: 「出庫」と正しく解答できている。
  • 1: 関連する業務操作を挙げているが、用語が不正確である。
  • 0: 無解答、または全く異なる内容を記述している。

解説

索引の見直しに関する設問です。在庫管理システムにおいて頻繁に発生する操作として 出庫 トランザクションが文脈に該当します。

高得点のポイント

  • トランザクションの種別として「出庫」を正しく挙げていること。

(2)

本文中のrに入れる適切な字句を答えよ。

模範解答

出庫倉庫コード

採点基準(配点 2点)

正確性(内容)(2点)

  • 2: 「出庫倉庫コード」と正しく解答できている。
  • 1: 倉庫に関する列である意図は読み取れるが、列名が不正確である。
  • 0: 無解答、または全く異なる内容を記述している。

解説

索引の対象となるテーブルの列名を答える設問です。出庫操作における検索条件として 出庫倉庫コード が該当します。

高得点のポイント

  • 対象となる列名「出庫倉庫コード」を正しく挙げていること。

(3)

本文中のsに入れる適切な字句を答えよ。

模範解答

部品番号

採点基準(配点 2点)

正確性(内容)(2点)

  • 2: 「部品番号」と正しく解答できている。
  • 1: 部品に関する列である意図は読み取れるが、列名が不正確である。
  • 0: 無解答、または全く異なる内容を記述している。

解説

索引の対象となるテーブルの列名を答える設問です。在庫管理において品目を特定するための重要な検索条件として 部品番号 が該当します。

高得点のポイント

  • 対象となる列名「部品番号」を正しく挙げていること。

(4)

本文中のtに入れる適切な字句を答えよ。

模範解答

更新

採点基準(配点 2点)

正確性(内容)(2点)

  • 2: 「更新」と正しく解答できている。
  • 1: データ変更に関する操作を挙げているが、指定された字句と合致しない。
  • 0: 無解答、または全く異なる内容を記述している。

解説

索引のパフォーマンスに影響を与えるデータベース操作についての設問です。データの 更新 が頻繁に行われると、索引の再構築も頻繁に発生しオーバーヘッドとなります。

高得点のポイント

  • データベース操作として「更新」を正しく挙げていること。

(5)

本文中のuに入れる適切な字句を答えよ。

模範解答

ロックの解放待ち

採点基準(配点 2点)

正確性(内容)(2点)

  • 2: 「ロックの解放待ち」と正しく解答できている。
  • 1: 待機状態であることは読み取れるが、表現に不備がある。
  • 0: 無解答、または全く異なる内容を記述している。

解説

排他制御によって他のトランザクションが待たされる状態を指す用語です。既存のロックが解除されるのを待機している状態であり、ロックの解放待ち が該当します。

高得点のポイント

  • 排他制御における待機状態を「ロックの解放待ち」と正しく表現していること。

(6)

本文中のvに入れる適切な字句を答えよ。

模範解答

処理状況

採点基準(配点 2点)

正確性(内容)(2点)

  • 2: 「処理状況」と正しく解答できている。
  • 1: ステータス管理列である意図は読み取れるが、列名が不正確である。
  • 0: 無解答、または全く異なる内容を記述している。

解説

出庫トランザクションなどで、処理が進むにつれてステータスが変わる列名です。未処理、引当済、出庫済などの状態を表す 処理状況 が該当します。

高得点のポイント

  • ステータスを表す列名「処理状況」を正しく挙げていること。

(7)

本文中の下線①について,索引キーにv列を加えることで索引の更新頻度が増加するのはなぜか。v列の特徴に着目して,30字以内で具体的に答えよ。

模範解答

出庫の処理が進むたびに索引キーの値が変わるから

採点基準(配点 3点)

知識・理解度(内容)(2点)

  • 2: 出庫処理の進行に伴って値が変化するという特徴を正確に捉えられている。
  • 1: 値が変化することには触れているが、出庫処理との関連が曖昧である。
  • 0: 処理状況列の特徴について正しく触れられていない。

論理性(構造)(1点)

  • 1: 値が変化するため索引も更新されるという論理展開が明確である。
  • 0: 論理展開が不自然、または設問の要求を満たしていない。

解説

「処理状況」列は、出庫などの処理が進むごとに値が頻繁に変化する特徴があります。これを索引キーに含めると、ステータスが更新されるたびに索引ツリーの再構築(Bツリーの更新)が発生し、データベースの更新オーバーヘッドが増加します。

高得点のポイント

  • 処理状況 列の値が、処理の進行に伴って頻繁に変化(更新)する特徴を指摘していること。
  • その変化によって索引キーの値が変わり、更新頻度が増加するという論理が示されていること。

設問3では,(2)の正答率が低かった。索引の更新契機についての一般的な知見で解答した受験者が多かったが,本文に記載された事例に即して解答してほしい。索引の変更に際して既存のトランザクションや運用に与える影響の分析・検証は重要である。