データベーススペシャリスト試験 2019年 午後103


部品表の設計及び処理に関する次の記述を読んで, 設問1〜4に答えよ。

 E社は,機械メーカである。 E 社では, RDBMS に構築した生産部品表(以下,部品表という)を用いて生産管理を行っている。 情報システム部門のFさんは,新たに配属された DB 管理者のために,部品表に関する研修を担当することになった。  
〔RDBMS の主な仕様〕 (1) 索引は,ユニーク索引と非ユニーク索引に分けられる。 (2) DML のアクセスパスは,RDBMSによって索引探索又は表探索に決められる。 (3) 索引探索に決められるためには, WHERE 句の AND だけで結ばれた一つ以上の等値比較の述語の対象列が, 索引キーの全体又は先頭から連続した一つ以上の列に一致していなければならない。 ON 句の場合も同様である。  
〔部品表の概要〕  部品表は,E社が製造する製品と製品を構成する部品との関係を表すものである。 Fさんは,研修で使用するために E 社の製品を簡略化して表した製品 AX AY 及び AZの構成図を図1に示し,次のように説明することにした。
1.品目  (1) 品目は,品番で識別し, 品目ごとに在庫をもっている  (2) 品目には,製品と, 他の部品を使って組み立てられる中間部品, 単独で使われる単体部品があり, 品目区分で分類する。 例えば、 図1 中の AX は製品, P1及びP2は中間部品, P3, P4及びP9は単体部品である。
2.製品の構成 (1) 製品は,複数種類の部品で構成され、構成図は,階層で表現される。製品からの階層の深さをレベルという。 製品のレベルを0として,階層を一つ下るごとにレベルに1を加算する。 例えば, 製品 AX を構成する部品について, レベル1に部品 P1, P4 及び P9, レベル2に部品 P2 及び P9, レベル3に部品 P3がある。 (2) 各部品について,当該部品を使う全ての製品の構成図の中で,当該部品が出現するレベルの最大値を, 最も深い階層を示すことから, ローレベルコード(以下, LLC という)という。 例えば、 図1では, 部品 P5 の LLC は 1, 部品P9のLLCは3である。 (3) ある品目が他の品目から構成される場合,当該品目を親品目といい, 親品番で識別する。また,当該親品目の一つ下のレベルの品目を子品目といい, 子品番で識別する。 (4) 親品目1個当たりに使う各子品目の個数を構成数という。 例えば, 製品 AX の製造に使う各部品の構成数は,次のとおりである。  ① 製品 AX は, 1個当たり,部品 P1を2個, 部品 P4, P9 をそれぞれ1個ずつ使う。  ② 部品 P1は,1個当たり,部品 P2, P9 をそれぞれ1個ずつ使う。  ③ 部品P2は, 1個当たり, 部品P3を2個使う。
データベーススペシャリスト試験(平成31年 午後I 問3 図1)
3.主なテーブルのテーブル構造  E社が生産管理に用いている主なテーブルのテーブル構造を図2に示す。図1に基づいて登録した“品目” テーブルの行を表1に, “構成” テーブルの行を表2に示す。  なお,各テーブルには主索引だけが定義されている。 索引キーが複合列の場合,テーブル構造に示した列の順番で定義される。
データベーススペシャリスト試験(平成31年 午後I 問3 図2)
データベーススペシャリスト試験(平成31年 午後I 問3 表1)
〔部品表に対する基本的な処理〕
1.正展開処理, 逆展開処理及び所要量計算処理の概要  Fさんは,部品表に対する三つの基本的な処理として, 正展開処理, 逆展開処理及び所要量計算処理を挙げた。  (1) 正展開処理は, 親品目がどの子品目を使っているかを, 階層を上から下に 1階層ずつたどることで調べる。  (2) 逆展開処理は, 子品目がどの親品目に使われているかを,正展開処理とは逆に,階層を下から上に1階層ずつたどることで調べる。 逆展開処理は、 ある部品が廃番になったとき, その部品がどの品目に影響するかを調べるときなどに行われる。  (3) 所要量計算処理は、製品の生産計画に基づいて,各製品の製造に必要な部品の所要量を計算し,計算した所要量を部品の引当可能数から差し引くことで,在庫を引き当てる。
2.正展開処理, 逆展開処理及び所要量計算処理に用いる SQL  Fさんは,部品表に対する三つの基本的な処理に用いられる SQL の構文の例を,表3に示した。
データベーススペシャリスト試験(平成31年 午後I 問3 表3)
〔所要量計算処理プログラムの概要〕  所要量計算処理プログラムは,表3中のSQL3 及び SQL4 を用いる。 F さんは,製品をN個製造する場合の所要量計算処理プログラムの処理手順を,表4に示した。  なお,当該処理は,次の前提で行うものとする。
(1) 各部品の所要量の計算は, SQL3 を用いて調べた構成数に基づいて, プログラムこのロジックで行う。 (2) ISOLATION レベルは, READ COMMITTED とする。 (3) 製品が複数ある場合, 製品の品番順に,製品ごとに手順 ①〜⑥を繰り返す。 (4) 在庫は,適切に管理されているので,引当可能数が負の数になることはない。
データベーススペシャリスト試験(平成31年 午後I 問3 表4)
〔Fさんの研修内容に対する K部長の指示〕  表4について, K部長から次のような指示があった。
 指示1:表 4 中の手順③の SQL3 の発行回数を減らすために,手順①及び③のSQL3 で部品の品目区分を調べている。 その理由を説明すること。  指示2:品目の設計変更において,例えば, 製品 AX の部品 P3 を新部品 P11 に置き換えるべきところ, 誤って部品 P1 を “構成” テーブルに登録してしまった場合, SQL3 の構文中に下線部分の述語が指定されていなければ,プログラムは不具合を起こすことを説明すること。  指示3:製品は多品種なので, スループット向上のために所要量計算を製品ごとに分割して並行処理している。 しかし, 表4の処理手順のままではデッドロックが起きるので,プログラムを改良したことを説明すること。

設問1(1)図1及び表2について,(1),(2)に答えよ。

図1中の(ア)〜(ウ)に入れる適切な字句を答えよ。
模範解答
ア:P3 イ:P6 ウ:P8
解説

キーワードと論点整理

  • 親品目/子品目,レベル(階層)
    「(3) ある品目が他の品目から構成される場合, 当該品目を親品目といい, 親品番で識別する。また, 当該親品目の一つ下のレベルの品目を子品目といい, 子品番で識別する。」
  • “構成”テーブル
    表2 に示すように,「親品番」「子品番」「構成数」の組み合わせで構成関係を管理
  • レベルごとの構成部品
    「製品からの階層の深さをレベルという。製品のレベルを0として, 階層を一つ下るごとにレベルに1を加算する。」

解答の論理展開

図1 の AY のツリー構造を見るには,まず表2 の“構成”テーブルから AY→子品目,さらにその子の子品目を引き出します。
親品番子品番構成数
AYP51
AYP91
P5P31
P5P61
P6P81
P6P91
  1. レベル1(製品 AY の子)
    表2 より
    • 親品番AY → 子品番P5, P9
      図1 中,AY の直下には P5 と P9 が並んでいることから一致
  2. レベル2(P5 の子)
    表2 より
    • 親品番P5 → 子品番P3, P6
      従って,図1 の P5 の下に並ぶ二つの未確定部品(ア)(イ)は
    • ア = P3
    • イ = P6
  3. レベル3(P6 の子)
    表2 より
    • 親品番P6 → 子品番P8, P9
      図1 の P6(=イ)の下には一つだけ枝(ウ)が示されているため,階層として最初に来る P8 が該当
    • ウ = P8
以上から,図1 中の(ア)~(ウ)はそれぞれ
ア:P3  
イ:P6  
ウ:P8
となります。

受験者が誤りやすいポイント

  • 「P6 → P9」 の存在
    表2 に P6 → P9(構成数1)もあるため,(ウ) を P9 と誤答しやすい。しかし図1 では製品 AY のレベル1 に既に P9 が配置されているため,同一階層(レベル3)で再度 P9 を描画しない設計。
  • 「P5 → P9」 の誤認
    P5 の子として P9 は存在せず,P5 の子は必ず表2 の P3, P6 から選ぶ必要がある。表を正確に読み取ることが重要です。

試験対策として覚えておくべきポイント

  • 階層(レベル)ごとの部品展開
    製品をレベル0とし,SQL の正展開・逆展開でレベルを意識した探索が必要
  • “構成”テーブルの読み取り
    親品番→子品番の組を正確に把握し,図やSQL の JOIN 条件と対応させる
  • 図表の重複表示に注意
    同一部品が複数の階層や製品で登場する場合,図示される位置を混同しない
  • 設問文のキーワード引用
    問題文中の「親品目」「子品目」「レベル」の定義は,必ず原文のまま理解・引用して,解答の根拠とすること。

設問1(2)図1及び表2について,(1),(2)に答えよ。

表2中の(エ)〜(カ)に入れる適切な字句を答えよ。
模範解答
エ:P7 オ:P7 カ:P2
解説

1. 模範解答の核心となるキーワードや論点

  • BOM(部品表)の親子関係
  • 図1の「製品AZ」のツリー構造
  • “構成”テーブルへの登録行(表2)
  • 親品番順・子品番順に並べられたテーブル行

2. なぜその解答になるのか

表2は「図1に基づいて登録した“構成”テーブルの行」とあり,製品や中間部品の親→子の対応がそのまま行として登録されています。空欄部分を埋めるには,図1中の構成ツリーを参照します。

表2 該当部分(Markdown形式で再掲)

親品番子品番構成数
AZP31
AZ(エ)2
AZP92
P1P21
P1P91
P2P32
P5P31
P5P61
P6P81
P6P91
(オ)(カ)1
P7P41

(エ)=P7 の論拠

問題文にある「図1中の製品AZの構成図」を見ると,AZの一次レベルの子品目は「P3」「P7」「P9」です。表2ではAZ→P3,AZ→P9が登録済みなので,残るAZ→P7が空欄(エ)に入ります。
「製品AZを構成する部品はP3, P7, P9である」

(オ)=P7,(カ)=P2 の論拠

次に,親品目P7の子品目を図1から読み取ります。図1のAZツリーでは,P7の下位にP2とP4がぶら下がっています。表2には「P7→P4 1」が登録済みなので,残る「P7→P2 1」を(オ),(カ)の行に登録します。
「P7の子品目はP2およびP4である」
以上より,
  • エ:P7
  • オ:P7
  • カ:P2
が正解となります。

3. 受験者が誤りやすいポイント

  1. 「AZの子品目」と「P7の子品目」を混同する
    • AZ→P7 だけを(エ)に入れ,P7→P2/P4のうち順序を取り違えやすい。
  2. 表2が親品番順・子品番順で並んでいることに気づかず,空行の位置から読み取らない
    • 空欄(オ)行の前後関係から親品番P7だと判断すればミスが防げます。

4. 試験対策として覚えておくべきポイント

  • 図1のツリー構造は,そのまま“構成”テーブルの親→子対応になる
  • 表2の行は「親品番順,子品番順」で並べられている
  • 空欄を埋める際には,
    1. 親品目の子品番リストを図から特定
    2. すでに登録済みの組み合わせを除外
    3. 残った組み合わせを順序に従って記入
  • BOM(部品表)問題では「どの部品がどこに何個ぶら下がっているか」を正確に読み取る練習が重要です。

設問2(1)〔部品表に対する基本的な処理〕 の正展開処理について,(1),(2)に答えよ。

表3中の SQL1の(a),(b)に入れる適切な字句を答えよ。
模範解答
a:子品番 b:親品番
解説

キーワード・論点整理

  • 正展開処理のSQL1では,製品AZのレベル1(直接の子品目)とレベル2(子品目の子品目)を取得し,部品ごとの所要量を合計する。
  • レベル1は
    SELECT 子品番 PNUM, 構成数 QTY
      FROM 構成
     WHERE 親品番='AZ'
    
  • レベル2はレベル1の子品目を親として,同じ「構成」テーブルを自己結合(SELF JOIN)で参照する。
    SELECT L2.子品番 PNUM,
           L2.構成数 * L1.構成数 QTY
      FROM 構成 L1
      JOIN 構成 L2
        ON L1.(a) = L2.(b)
     WHERE L1.親品番='AZ'
    
  • ここで,L1のある列とL2のある列を結合キーにしているが,それぞれ「子品番」「親品番」を対応づける必要がある。

解答

位置入れる字句
(a)子品番
(b)親品番

解答の論理的説明

  1. 「構成」テーブルは次のようになっており,親品目‐子品目のペアを示しています。
    親品番子品番構成数
    AXP12
    AXP41
  2. レベル2の部品を取得するためには,
    • レベル1の各子品番(L1.子品番)を
    • レベル2の親品番(L2.親品番)と一致させ
    • L2.子品番を取得する
      という手順になります。
  3. したがって,自己結合のON句は
    ON L1.子品番 = L2.親品番
    
    と記述しなければなりません。
  4. 以上から,(a)に「子品番」,(b)に「親品番」を入れることで,SQL1が製品AZのレベル2までの部品を正しく取得できます。

受験者が誤りやすいポイント

  • 「親品番」「子品番」を逆にすると,レベルを下る方向と合わず,取得されるデータが全く異なります。
  • ON句の左右どちらをどちらのテーブル列に対応づけるか混同しやすいため,まず「L1は親AZの直接子品目を持つテーブル」「L2も同じ構成テーブル」と意識して整理することが重要です。
  • UNION ALLで結合しているため,レベル1とレベル2を同一の列構造に合わせる点も見落としがちです。

覚えておくべきポイント

  1. 構成表(BOM)の正展開では,自己結合を用いて階層をたどる。
  2. 自己結合時のON句は,「上位階層の子品番 = 下位階層の親品番」で結ぶ。
  3. UNION ALLで各レベルの結果をまとめ,SUM(QTY)で部品ごとに所要量を合計する。
  4. テーブルの列名を正確に把握し,JOIN条件の前後を論理的に対応づける癖をつけると誤りを防げる。

設問2(2)〔部品表に対する基本的な処理〕 の正展開処理について,(1),(2)に答えよ。

製品 AZ を1個製造するのに必要な, 部品 P2, P3 及び P4 の所要量をそれぞれ答えよ。
模範解答
P2:2 P3:5 P4:2
解説

キーワード・論点整理

  • 階層構造(レベル)
    製品から下位部品へ階層的に展開し,レベルごとに構成数を乗算して所要量を求める。
  • 構成数
    「親品目1個当たりに使う各子品目の個数を構成数という。」
  • 正展開処理
    「親品目がどの子品目を使っているかを, 階層を上から下に1階層ずつたどることで調べる。」
  • 所要量計算
    各部品の所要量は,経路上の各構成数を掛け合わせ,複数経路があれば合算する。

解答の根拠と論理的説明

製品AZの構成を表2から抜き出し,部品P2,P3,P4それぞれの所要量を階層ごとに計算します。
  1. 製品AZの直下の子品目と構成数
    親品番子品番構成数
    AZP31
    AZP72
    AZP92
  2. P7の子品目と構成数
    親品番子品番構成数
    P7P21
    P7P41
  3. P2の子品目と構成数
    親品番子品番構成数
    P2P32
これをもとに,各部品の所要量を計算します。
  • P2の所要量
    製品AZ → P7 の構成数 2 × P7 → P2 の構成数 1
    よって P2:2 × 1 = 2
  • P4の所要量
    製品AZ → P7 の構成数 2 × P7 → P4 の構成数 1
    よって P4:2 × 1 = 2
  • P3の所要量
    ① 直接ルート:製品AZ → P3 の構成数 1 → 1
    ② P7経由ルート:製品AZ → P7 の構成数 2 × P7 → P2 の構成数 1 × P2 → P3 の構成数 2
    → 2 × 1 × 2 = 4
    合計:1(直接) + 4(間接) = 5
以上より,
P2:2
P3:5
P4:2

受験者が誤りやすいポイント

  • 「直接ルートでのP3」を見落として,P3=4と誤答しやすい。
  • 構成数を単に加算せず,「階層を通じた乗算→経路ごとに合算」というルールを忘れやすい。
  • 表2の未記入箇所を補完せず,P7→P2の情報を間違えると全体が狂う。

試験対策として覚えておくべきポイント

  1. 部品表の正展開処理では,必ず「親→子」の経路上で構成数を乗算し,複数経路は合算する。
  2. 表2などの部品表データを読むときは,未記入や仮記号の補完を怠らない。
  3. 問題文章中の「構成数」「LLC」「正展開処理」の定義を正確に理解し,手順をイメージして解答する。

設問3(1)〔部品表に対する基本的な処理〕 の逆展開処理について,(1),(2)に答えよ。

表3 中の SQL2の(c),(d)に入れる適切な字句を答えよ。  また, SQL2 を用いて得られる図1中の製品の品番を全て答えよ。
模範解答
c:親品番 d:子品番 品番:AX
解説

キーワード・論点整理

  • 逆展開処理
    「子品目がどの親品目に使われているかを, … 階層を下から上に1階層ずつたどる」【問題文】
  • 構成テーブルの主な列
    「構成(親品番,子品番,構成数,…)」【図2】
  • SQL2 の目的
    「逆展開処理において、レベル2に部品 P9 を使っている全ての製品の品番を調べる」【表3】
  • JOIN の方向
    1. L2(エイリアス)で WHERE L2.子品番 = 'P9' → P9 の直接の親品番を抽出
    2. L1(エイリアス)で ON L2.親品番 = L1.子品番 → さらに1階層上の親品番を抽出
  • 製品に絞り込むための条件
    JOIN 品目 ON L1.親品番 = 品番 WHERE LLC = 0 → 品目区分が「製品」のみ抽出

解答の論理的説明

SQL2 の構文(空欄を太字で示す)
SELECT L1.親品番
FROM 構成 L2
JOIN 構成 L1
  ON L2.​​**親品番** = L1.​​**子品番**
JOIN 品目
  ON L1.親品番 = 品番
WHERE
  L2.子品番 = 'P9'
  AND LLC = 0
  1. L2 で「子品番 = 'P9'」を指定し、P9 の直接の親品番を取得
    L2.親品番L2.子品番
    AXP9
    P1P9
    AYP9
    P6P9
    AZP9
  2. L1 との ON L2.親品番 = L1.子品番 で、さらに上位(2階層上)の親品番を取得
    L1.親品番L1.子品番該当理由
    AXP1L2.親品番 = 'P1' → AX→P1
    P5P6L2.親品番 = 'P6' → P5→P6
  3. 「製品」のみを得るために品目テーブルを結合し WHERE LLC = 0 で絞り込む
    • AX の LLC = 0 → 抽出
    • P5 の LLC = (空欄/中間部品) → 除外
よって SQL2 で得られる品番は AX です。

受験者が誤りやすいポイント

  • ON 句の結合条件を逆にしてしまう
    • L2.子品番 = L1.親品番 とすると、1階層上(AX→P1)ではなく不正な結合になる
  • WHERE LLC = 0 を忘れると、中間部品 P5 まで出力されてしまう
  • 構成テーブルの列名は「親品番」「子品番」であることを正確に把握する

試験対策として覚えておくべきポイント

  • 逆展開処理 → 「子→親」を追う JOIN を行う
  • 構成テーブル の主索引キーは (親品番, 子品番) の順序
  • LLC = 0 は「製品」を示す
  • JOIN の ON と WHERE の 絞り込み は役割が異なる
  • SQL の空欄補充では,「結合方向」と「列名」をミスしないよう確認すること

設問3(2)〔部品表に対する基本的な処理〕 の逆展開処理について,(1),(2)に答えよ。

SQL2 が参照する全てのテーブルのアクセスパスは, 索引探索に決められるようにしたい。 “構成” テーブルにユニーク索引を追加する場合、 その索引を構成する全ての列名を定義順に答えよ。
模範解答
子品番,親品番
解説

1. 解答のキーワード・論点整理

  • RDBMS の「索引探索」要件
    「WHERE句の AND だけで結ばれた一つ以上の等値比較の述語の対象列が,索引キーの全体又は先頭から連続した一つ以上の列に一致していなければならない」
  • SQL2 における 構成テーブル 参照箇所
    • L2:WHERE L2.子品番 = 'P9'
    • L1:JOIN 構成 L1 ON L2.子品番 = L1.親品番
  • 既存の主索引(PRIMARY INDEX)
    • 構成(親品番, 子品番, …) ⇒ キー順は (親品番 → 子品番)

2. なぜ「子品番, 親品番」の順序になるのか

RDBMS仕様より,索引探索を行うには検索条件の列が「索引キーの先頭から連続した列」である必要があります。
  1. L2 のアクセス(WHERE句)
    FROM 構成 L2
    WHERE L2.子品番 = 'P9'
    
    ‐ この条件を索引探索で高速化するには,追加する索引の先頭列子品番 でなければなりません。
  2. L1 のアクセス(JOIN句)
    JOIN 構成 L1
      ON L2.子品番 = L1.親品番
    
    ‐ L2 の 子品番='P9' を受けて,L1 側は 親品番='P9' を条件にレコードを取得します。
    ‐ L1 側は既存の主索引(親品番 → 子品番)で 親品番 が先頭列になっているため,主索引を使った索引探索が可能です。
したがって,
  • L2 用子品番 を先頭列とする新しいユニーク索引を追加し
  • L1 用には既存の主索引 (親品番 → 子品番) を利用
という組み合わせで,SQL2 の両方の構成テーブル参照を索引探索にできます。
【追加ユニーク索引】
順序列名
1子品番
2親品番

3. 受験者の誤りやすいポイント

  • 「索引キーの順序」を取り違える
    親品番, 子品番 と書いてしまうと,L2 の 子品番='P9' 条件で索引探索ができなくなります(先頭列が親品番ではないため)。
  • ユニーク索引と主索引を混同する
    ‐ 主索引(親品番→子品番)がすでにあるのに「再び同じ順序でユニーク索引を追加する」ことは不要です。
  • 「何を高速化したいか」を見落とす
    ‐ SQL2 は構成テーブルを2回参照するため,それぞれ異なる条件を高速化するには,既存主索引との組み合わせを考慮する必要があります。

4. 試験対策ポイント

  • 索引探索要件:「先頭から連続」のルールを厳守して設計すること
  • 複合索引の列順は,実際の検索条件の順序(特に等値比較の有無)をもとに決める
  • 既存のインデックス状況を把握し,新設インデックスと重複しないように設計する
  • SQL のアクセスパス(索引探索 or 全表走査)がパフォーマンスに大きく影響することを理解し,適切なインデックス設計力を身につけること

設問4(1)〔Fさんの研修内容に対する K部長の指示〕 について,(1)〜(4)に答えよ。

指示に対して, なぜ部品の品目区分を調べれば, SQL3の発行回数を減らすことができるのか,その理由を30字以内で述べよ。
模範解答
単体部品は子部品がないので SQL3 の発行は不要だから
解説

キーワード・論点整理

  • 単体部品
  • 子品目がない
  • SQL3 発行不要

解答の論理的な説明

問題文では、品目区分について次のように定義しています。
「品目には, 製品と, 他の部品を使って組み立てられる中間部品, 単独で使われる単体部品があり, 品目区分で分類する。」
さらに、単体部品は「他の部品を使って組み立てられる」要件を持たず、子品目を持たないため、再帰的に一つ下のレベルの部品を取得する SQL3 を発行しても結果が得られません。
したがって、単体部品の場合は手順③(子品目取得)の SQL3 をスキップでき、発行回数を減らせます。

受験者が誤りやすいポイント

  • 「LLC」や「レベル」と混同して、SQL3 の WHERE 句(LLC >= :HLLC)に着目しがち
  • 中間部品も子品目を持つので、ここでスキップできるのはあくまで単体部品のみ
  • 品目区分の意味を「在庫管理上の区分」と誤解して、本来の構成ツリーとの関係を見落とす

用語整理(試験対策)

品目区分意味子品目の有無
製品最上位の完成品
中間部品他の部品を組み立てて作られる部品
単体部品他の部品を使わず単独で使われる部品
  • 単体部品は必ず末端ノードになるため、再帰的な部品展開で SQL 発行を省略できる
  • 「品目区分」で単体部品を判定し、SQL3 の無駄な呼び出しを抑制することが処理効率向上のポイントです。

設問4(2)〔Fさんの研修内容に対する K部長の指示〕 について,(1)〜(4)に答えよ。

指示2 に対して,プログラムが起こす不具合とは, 処理がどのようになることか, 20字以内で述べよ。
模範解答
処理が無限ループして終わらない。
解説

キーワードと論点整理

  • SQL3 の下線部の述語
    AND LLC >= :HLLC
  • ループ処理(手順③~⑤)
    手順③→手順④→手順⑤→手順③…と再帰的に深い階層をたどる
  • 不具合の症状
    返却結果が減らずに同じ品目を繰り返し処理し続ける

解答の理由

SQL3 の構文(下線部省略前後)を整理します。
SQL3 の構文例
SELECT 子品番, 構成数, 品目区分
FROM 構成 JOIN 品目 ON 子品番 = 品番
WHERE 親品番 = :HPNUM AND LLC >= :HLLC
ORDER BY 子品番
  • 手順①・③では「SQL3」を発行し、一つ下のレベルの部品を得るために :HLLC(現在品目のレベル+1)を設定しています。
    → 問題文より
    「ここで、当該品目の一つ下のレベルの値を、HLLC に設定する。」
  • 下線の「AND LLC >= :HLLC」がないと、指定した親品番の全階層の子品目を返します。
  • 手順④~⑤で「子品目が存在する限り、手順⑤→手順③に戻る」ため、階層が深くなるごとに絞り込めず、同じ親子関係を再度取得し続けます。
    → 無限にループして処理が終わらなくなります。
したがって、下線部の述語が指定されていないと「処理が無限ループして終わらない」現象が起こります。

受験者が誤りやすいポイント

  • 「LLC ≥ :HLLC」の役割を見落とす
    「LEVEL 制御」と思わずに、単なるフィルタ条件と考えてしまいがちです。
  • 無限ループ=無応答ではない
    単に結果が多くなるだけと思って次に進んでしまい、ループ終了条件と結びつけないケースがあります。

試験対策として覚えておくポイント

  1. 階層検索での制限条件
    再帰的に階層構造をたどる際は、必ず「何階層目まで」かを WHERE 句で制御する。
  2. ループ終了条件の確認
    プログラム手順(疑似コード)と SQL の検索範囲が合致しているかをチェックする。
  3. DDL/DML と業務ロジックの整合性
    SQL の絞り込み条件を外すと業務ロジック(在庫引当・再帰処理など)が破綻することを意識する。

設問4(3)〔Fさんの研修内容に対する K部長の指示〕 について,(1)〜(4)に答えよ。

指示3で述べられたデッドロックについて, F さんは,図 1 の製品 AX と AZ の間で起きるデッドロックの一つのケースを,ケース1として図3に示し,デッドロックに関わる2種類の部品の組合せを丸印で囲んだ。 図3に倣って, 他にデッドロックが起きるケースをケース2として, 図4を完成させよ。 データベーススペシャリスト試験(平成31年 午後I 問3 図3,4)
模範解答
データベーススペシャリスト試験(平成31年 午後I 問3 設問4-3解答)
解説

模範解答の核心キーワード・論点

  • ロックのかかる対象:SQL4 の UPDATE 在庫 … WHERE 品番 = :HPNUM による行単位ロック
  • ロック取得順序:SQL3 の ORDER BY 子品番 に従って、階層ごとに子品番の昇順で更新(ロック)
  • デッドロックの条件
    1. 互いに必要なリソースを異なる順序でロック
    2. サイクル状に待ち合いが発生
  • ケース1:部品 P3P9 のロック順序が逆転
  • ケース2:部品 P2P3 のロック順序が逆転

なぜその解答になるのか

1. SQL3/SQL4 によるロック取得の順序

問題文より
「SQL3 … WHERE 親品番 = :HPNUM AND LLC >= :HLLC ORDER BY 子品番」
「SQL4 … UPDATE 在庫 … WHERE 品番 = :HPNUM」
  • SQL3 の ORDER BY 子品番 で子品番の昇順リストを取得
  • その順で SQL4 を繰り返し発行 → 行レベルのロックを品質番号順に取得
  • COMMIT は製品ごと最後(手順⑥)まで行われないため、ロックは保持されたまま

2. AX/AZ の更新(ロック)シーケンス

以下は「製品 AX を N 個作る」場合と「製品 AZ を N 個作る」場合の、SQL4 が発行される実際の品番順序例です。
製品ロック取得順序(SQL4 発行順)
AXP1 → P4 → P9 → P2 → P9 → P3
AZP3 → P7 → P9 → P2 → P4 → P3 → P9
(重複品番も都度ロック要求しようとするので、実際は最初のロック取得後は即座に再度ロックを待つ動作になります)

3. デッドロック発生パターン

  • ケース1(共有リソース P3, P9)
    • AX 側は …P9 → …P3 の順にロック
    • AZ 側は …P3 → …P9 の順にロック
    • ↳ P9 を AX が先に、P3 を AZ が先に取り合う → 相互待ち(図3)
  • ケース2(共有リソース P2, P3)
    • AX 側は …P2 → …P3
    • AZ 側は …P3 → …P2
    • ↳ P2 を AX が先に、P3 を AZ が先に取り合う → 相互待ち(図4)
この「ロック取得の逆転」がデッドロックの本質です。

受験者が誤りやすいポイント

  1. 子品目の発行順序をLEVEL単位ではなく「ORDER BY 子品番」 と誤解
  2. 重複する同一品番の再ロック要求 を見落とし、「一度取ったら二度と要求しない」と考える
  3. 階層をまたいだロック順序 を正確に時系列で追わず、どこで逆転が起きるかを把握できない
  4. 図のノードを単に「同一品番がある」だけで囲み、実際に逆転順序となる組合せ を取り違える

試験対策:覚えておくべきポイント

  • SQL の ORDER BYロック取得順序 に直結する
  • デッドロックは「A→B」「B→A」のような 相互ロック待ち が要件
  • 階層構造をトラバースする処理では、レベルごとに並び替え条件 を必ず明示
  • 並行更新では COMMIT のタイミング によりロック保持期間が大きく変わる
  • 小問では必ず SQL3/SQL4 の発行順序 を具体的に時系列で書き出し、逆転ポイントを明確にする
これらを身につければ、部品表の並行処理に関する問題でデッドロック検出の設問は確実に得点できます。

設問4(4)〔Fさんの研修内容に対する K部長の指示〕 について,(1)〜(4)に答えよ。

指示3に対して,Fさんは,プログラムの改良について,次のように説明した。“SQL4 を,製品ごとレベルごと部品ごとに実行するのではなく, 製品ごと部品ごとに集計した所要量をホスト変数 HQTY に設定してから表4の手順⑥の前に実行するように, 手順②〜⑤を改良しました。”  この説明に加えて, 複数回の SQL4 をどのように実行するべきか 20字以内で述べよ。
模範解答
SQL4 を部品の品番順に実行する。
解説

1. 模範解答のキーワードと論点

  • キーワード:部品の品番順
  • 論点:複数プロセスが同時に SQL4(UPDATE)を実行するときに,ロック獲得の順序をそろえてデッドロックを防ぐ

2. 解答の論理的根拠

表4 の手順では,階層ごとに部品ごとに SQL4 を繰り返し実行しています。
並行処理環境下で,異なる製品の処理がそれぞれ部品A → 部品B,別プロセスが部品B → 部品Aの順で UPDATE を行うと,以下のようにお互いがロック待ちとなりデッドロックが発生します。
  • プロセス1:UPDATE 在庫 WHERE 品番='A' → ロック取得
  • プロセス2:UPDATE 在庫 WHERE 品番='B' → ロック取得
  • プロセス1:UPDATE 在庫 WHERE 品番='B' → B のロック待ち
  • プロセス2:UPDATE 在庫 WHERE 品番='A' → A のロック待ち
これを防ぐには,「すべてのプロセスが同じ順序でロック取得を行う」ことが鉄則です。
したがって,複数回の SQL4 を部品の品番順(全プロセス共通の一意な順序)で実行するように改めることで,デッドロックを回避できます。
【引用】
「SQL4 を,製品ごとレベルごと部品ごとに実行するのではなく, 製品ごと部品ごとに集計した所要量をホスト変数 HQTY に設定してから…実行するように…改良しました。」

3. 受験者が誤りやすいポイント

  • 「製品ごとにまとめて一括実行する」「レベルごとにまとめて実行する」など,まとまって実行するタイミングだけに注目し,ロック順序の重要性を見落としやすい。
  • 結果として「一度にまとめて1回だけ UPDATE すればよい」と勘違いしがちだが,正しくは「複数回実行するなら順序を固定する」ことが肝要。

4. 試験対策ポイント

  • デッドロック回避の基本は「複数リソースへのロック取得順序をそろえる」こと
  • UPDATE 文などで同一テーブルの複数行を修正する場合,必ず ORDER BY でキー順に実行する
  • 並行処理を扱う問題では「ロック」「待機」「デッドロック」「順序統一」が頻出キーワード
  • 手順改善の記述では,何を(何回実行→まとめてor順序固定)どのように(品番順など)見せるか意識すること
← 前の問題へ次の問題へ →

©︎2025 情報処理技術者試験対策アプリ