DBデータベーススペシャリスト試験 午後Ⅰ

平成31年度春期 データベーススペシャリスト 午後Ⅰ 問3

事例を読んで設問の答えを考えてから、解説のポイントとIPA公式の解答例・採点講評で確認しましょう。

問題

問3 部品表の設計及び処理に関する次の記述を読んで、設問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個使う。 図1 製品AX、AY及びAZの構成図(未完成) 3.主なテーブルのテーブル構造 E社が生産管理に用いている主なテーブルのテーブル構造を図2に示す。図1に基づいて登録した“品目”テーブルの行を表1に、“構成”テーブルの行を表2に示す。 なお、各テーブルには主索引だけが定義されている。索引キーが複合列の場合、テーブル構造に示した列の順番で定義される。 図2 主なテーブルのテーブル構造(一部省略) 表1 “品目”テーブルの行(一部省略) 表2 “構成”テーブルの行(未完成) 〔部品表に対する基本的な処理〕 1.正展開処理、逆展開処理及び所要量計算処理の概要 Fさんは、部品表に対する三つの基本的な処理として、正展開処理、逆展開処理及び所要量計算処理を挙げた。 (1) 正展開処理は、親品目がどの子品目を使っているかを、階層を上から下に1階層ずつたどることで調べる。 (2) 逆展開処理は、子品目がどの親品目に使われているかを、正展開処理とは逆に、階層を下から上に1階層ずつたどることで調べる。逆展開処理は、ある部品が廃番になったとき、その部品がどの品目に影響するかを調べるときなどに行われる。 (3) 所要量計算処理は、製品の生産計画に基づいて、各製品の製造に必要な部品の所要量を計算し、計算した所要量を部品の引当可能数から差し引くことで、在庫を引き当てる。 2.正展開処理、逆展開処理及び所要量計算処理に用いるSQL Fさんは、部品表に対する三つの基本的な処理に用いられるSQLの構文の例を、表3に示した。 表3 SQLの構文の例(未完成) 〔所要量計算処理プログラムの概要〕 所要量計算処理プログラムは、表3中のSQL3及びSQL4を用いる。Fさんは、製品をN個製造する場合の所要量計算処理プログラムの処理手順を、表4に示した。 なお、当該処理は、次の前提で行うものとする。 (1) 各部品の所要量の計算は、SQL3を用いて調べた構成数に基づいて、プログラムのロジックで行う。 (2) ISOLATIONレベルは、READ COMMITTEDとする。 (3) 製品が複数ある場合、製品の品番順に、製品ごとに手順①~⑥を繰り返す。 (4) 在庫は、適切に管理されているので、引当可能数が負の数になることはない。 表4 所要量計算処理プログラムの処理手順 〔Fさんの研修内容に対するK部長の指示〕 表4について、K部長から次のような指示があった。 指示1 表4中の手順③のSQL3の発行回数を減らすために、手順①及び③のSQL3で部品の品目区分を調べている。その理由を説明すること。 指示2 品目の設計変更において、例えば、製品AXの部品P3を新部品P11に置き換えるべきところ、誤って部品P1を“構成”テーブルに登録してしまった場合、SQL3の構文中に下線部分の述語が指定されていなければ、プログラムは不具合を起こすことを説明すること。 指示3 製品は多品種なので、スループット向上のために所要量計算を製品ごとに分割して並行処理している。しかし、表4の処理手順のままではデッドロックが起きるので、プログラムを改良したことを説明すること。 設問1 図1及び表2について、(1)、(2)に答えよ。 (1) 図1中の【ア】~【ウ】に入れる適切な字句を答えよ。 (2) 表2中の【エ】~【カ】に入れる適切な字句を答えよ。 設問2 〔部品表に対する基本的な処理〕の正展開処理について、(1)、(2)に答えよ。 (1) 表3中のSQL1の[a]、[b]に入れる適切な字句を答えよ。 (2) 製品AZを1個製造するのに必要な、部品P2、P3及びP4の所要量をそれぞれ答えよ。 設問3 〔部品表に対する基本的な処理〕の逆展開処理について、(1)、(2)に答えよ。 (1) 表3中のSQL2の[c]、[d]に入れる適切な字句を答えよ。また、SQL2を用いて得られる図1中の製品の品番を全て答えよ。 (2) SQL2が参照する全てのテーブルのアクセスパスは、索引探索に決められるようにしたい。“構成”テーブルにユニーク索引を追加する場合、その索引を構成する全ての列名を定義順に答えよ。 設問4 〔Fさんの研修内容に対するK部長の指示〕について、(1)~(4)に答えよ。 (1) 指示1に対して、なぜ部品の品目区分を調べれば、SQL3の発行回数を減らすことができるのか、その理由を30字以内で述べよ。 (2) 指示2に対して、プログラムが起こす不具合とは、処理がどのようになることか、20字以内で述べよ。 (3) 指示3で述べられたデッドロックについて、Fさんは、図1の製品AXとAZの間で起きるデッドロックの一つのケースを、ケース1として図3に示し、デッドロックに関わる2種類の部品の組合せを丸印で囲んだ。図3に倣って、他にデッドロックが起きるケースをケース2として、図4を完成させよ。 図3 デッドロックのケース1 図4 デッドロックのケース2(未完成) (4) 指示3に対して、Fさんは、プログラムの改良について、次のように説明した。“SQL4を、製品ごとレベルごと部品ごとに実行するのではなく、製品ごと部品ごとに集計した所要量をホスト変数HQTYに設定してから表4の手順⑥の前に実行するように、手順②~⑤を改良しました。” この説明に加えて、複数回のSQL4をどのように実行するべきか、20字以内で述べよ。
図1 製品AX、AY及びAZの構成図(未完成)。製品AX、AY、AZを頂点とし、P1~P9の部品構成を階層的に示した未完成の構成図。
図1 製品AX、AY及びAZの構成図(未完成)。製品AX、AY、AZを頂点とし、P1~P9の部品構成を階層的に示した未完成の構成図。
図2 主なテーブルのテーブル構造(一部省略)。品目、構成、在庫の各テーブルについて、主要な列名を示したテーブル構造図。
図2 主なテーブルのテーブル構造(一部省略)。品目、構成、在庫の各テーブルについて、主要な列名を示したテーブル構造図。
表1 “品目”テーブルの行(一部省略)。品番、品名、品目区分、LLCなどを列とする品目テーブルの登録行一覧。
表1 “品目”テーブルの行(一部省略)。品番、品名、品目区分、LLCなどを列とする品目テーブルの登録行一覧。
表2 “構成”テーブルの行(未完成)。親品番、子品番、構成数などを列とする構成テーブルの登録行一覧。複数の空欄がある。
表2 “構成”テーブルの行(未完成)。親品番、子品番、構成数などを列とする構成テーブルの登録行一覧。複数の空欄がある。
表3 SQLの構文の例(未完成)。正展開、逆展開、所要量計算に用いるSQL1~SQL4の目的と構文例をまとめた未完成の表。
表3 SQLの構文の例(未完成)。正展開、逆展開、所要量計算に用いるSQL1~SQL4の目的と構文例をまとめた未完成の表。
表4 所要量計算処理プログラムの処理手順。所要量計算プログラムの手順①~⑥と、それぞれの処理内容を示した手順表。
表4 所要量計算処理プログラムの処理手順。所要量計算プログラムの手順①~⑥と、それぞれの処理内容を示した手順表。
図3 デッドロックのケース1。製品AXとAZの部品構成を並べ、デッドロックに関わるP9とP3を丸印で示した図。
図3 デッドロックのケース1。製品AXとAZの部品構成を並べ、デッドロックに関わるP9とP3を丸印で示した図。
図4 デッドロックのケース2(未完成)。製品AXとAZの部品構成を並べ、別のデッドロックケースで丸印を補う未完成図。
図4 デッドロックのケース2(未完成)。製品AXとAZの部品構成を並べ、別のデッドロックケースで丸印を補う未完成図。
解き方のヒントを見る

処理の入出力を一つずつ追う

設問が問う処理について、何を読み取り何を書き出すのかを一つずつ言葉にして確認しましょう。記述されている条件や前提を自分の理解と照らし合わせ、根拠を問題の記述の中に求める姿勢で検討を進めることが大切です。

この問題で問われていること

確認すべき観点は一つ、各処理がどのデータを入力として受け取り、どのデータを結果として残すかという対応関係です。この対応を記述に即して整理できれば、どの箇所で何が求められているかを落ち着いて判断できます。

視点

データを扱う処理を検討するときは、処理の前後でデータがどう変わるかを追うのが基本です。入力、途中の結果、最終的な出力を区別し、それぞれを自分の言葉で説明できるかを確かめると、理解があいまいな部分に気付きやすくなります。

確認ポイント

  • 各処理が受け取るデータと残すデータを区別して書き出せるか
  • 処理の前後でデータの状態がどう変わるかを記述から追えるか
  • 判断の根拠が問題に書かれた条件や前提に基づいているか
正解と解説を見る

解説

E社の生産部品表を題材に、構成テーブル(親品番、子品番、構成数)の自己結合による正展開・逆展開、所要量の計算、逆展開に必要な索引の設計、品目区分とLLCを使った処理の効率化と矛盾の検知、並行して行う所要量計算処理で起きるデッドロックとその回避を問う問題です。公式解答例では、逆展開用の索引を(子品番,親品番)とし、デッドロックの回避策を「SQL4を部品の品番順に実行する」としています。

問題の全体像

E社はRDBMS上に生産部品表を構築しており、FさんがDB管理者向けの研修資料を作る、という設定です。品目テーブル(品番、品目区分、LLC)、構成テーブル(主キーは親品番,子品番)、在庫テーブル(品番、引当可能数)があり、各テーブルには主索引だけが定義されています。前半では、図1の構成図と表2の構成テーブルの対応、正展開のSQL1と逆展開のSQL2、索引の追加を扱います。後半では、表4の所要量計算処理プログラムに対するK部長の3つの指示(品目区分でSQL3の発行回数を減らす、LLCの述語で不具合を防ぐ、並行処理で起きるデッドロックを回避する)を扱います。出題趣旨では、部品表の基本的なテーブル設計と索引設計、正展開処理・逆展開処理・所要量計算処理の概要、それを操作するSQL構文の特徴と考慮点を理解しているかを問うとしています。採点講評では、全体として正答率は高く、設問1、2及び設問3(1)の正答率は高かったと述べています。設問3(2)については、主索引と同じ順番に列名を並べた誤った解答が散見されたと述べています。設問4(1)、(2)は設問1、2に比べて正答率が低く、設問4(3)と設問4(4)はそれぞれ正答率が低かったとしています。

設問1(1)(ア)

図1の製品AYは、P5の下に【ア】と【イ】があり、【イ】の下に【ウ】とP9があります。表2で親品番がP5の行を探すと、子品番はP3とP6の2行です。このうち、さらに子品目を持つのはP6(P6→P8、P6→P9)で、P3を親品番とする行はありません。したがって、子品目を持たない側の【ア】がP3です。公式解答例もP3です。

設問1(1)(イ)

【イ】はP5の子品目で、その下に【ウ】とP9がぶら下がっています。表2で子品番にP9を持つ親品番のうち、P5の子品目でもあるのはP6です(P5→P6、P6→P9)。したがって【イ】はP6で、公式解答例もP6です。

設問1(1)(ウ)

【ウ】は【イ】(P6)の子品目で、P9ではない方です。表2の親品番P6の行は子品番P8とP9なので、【ウ】はP8です。公式解答例もP8です。図1のLLCの例(P9のLLCは3)とも矛盾しません。AYではP5→P6→P9でP9がレベル3に現れるからです。

設問1(2)(エ)

表2で親品番がAZの行は、P3、【エ】(構成数2)、P9の3行です。図1のAZの直下はP3、P7、P9なので、残る【エ】はP7です。公式解答例もP7です。

設問1(2)(オ)

表2には、図1で親子関係にあるのに記載されていない組があるはずです。図1のAZではP7の下にP2とP4があり、表2の最終行にはP7→P4だけがあります。したがって、P7→P2の行が欠けています。表2は親品番順に並んでおり、P6の行の後、P7→P4の直前に位置する【オ】は親品番P7です。公式解答例もP7です。

設問1(2)(カ)

前の空欄と同じく、欠けている行はP7→P2です。子品番の【カ】はP2で、公式解答例もP2です。子品番順でもP2はP4より前に来るので、行の並びとも合っています。なお、P2→P3の行は表2に既にあるため、AZの下でP2の下にP3が続く構成も表されています。

設問2(1)(a)

SQL1のUNION ALLの後半は、レベル2の部品を求める部分です。L1は親品番='AZ'の行、つまりAZの直下(レベル1)の部品を表します。その部品を親とする行をL2として結合するので、結合条件はL1の子品番とL2の親品番を等しくすることになります。したがって【a】はL1側の子品番で、公式解答例も子品番です。所要量は、L2.構成数とL1.構成数の積で求めています。

設問2(1)(b)

前の空欄と同じ理由で、L2側は親品番です。レベル1の部品(L1.子品番)がL2の親品番に一致する行を探すことで、1階層下をたどれます。公式解答例も親品番です。

設問2(2)

表2の構成数を使ってAZ1個分を計算します。AZ直下はP3×1、P7×2、P9×2です。P7はP2×1、P4×1を使うので、P2は2×1=2個、P4は2×1=2個です。P2はP3×2を使うので、レベル3のP3は2×2=4個です。これにAZ直下のP3の1個を加えると、P3は5個になります。公式解答例も、P2が2、P3が5、P4が2です。P3は複数のレベルに現れるので、レベルをまたいで合計するのがポイントです。

設問3(1)(c)

SQL2は逆展開で、L2を子品番='P9'の行とし、そこから1階層上をたどります。L2の親品番(P9の親)を子品番に持つ行がL1になるので、結合条件はL2.親品番 = L1.子品番です。したがって【c】は親品番で、公式解答例も親品番です。

設問3(1)(d)

前の空欄と同じ理由で、L1側は子品番です。L1の親品番を品目テーブルと結合し、LLC=0(製品)に絞り込むことで、レベル2にP9を使う製品が得られます。公式解答例も子品番です。

設問3(1)(製品の品番)

P9を子品番とする行は、AX→P9、AY→P9、AZ→P9、P1→P9、P6→P9です。さらに1階層上の親が製品(LLC=0)かどうかを調べます。P1の親はAXで製品です。P6の親はP5で、製品ではありません。AX、AY、AZは製品なので、それらの上に親はありません。したがって、レベル2でP9を使う製品はAXだけで、公式解答例もAXです。AYはP5→P6→P9でP9をレベル3に使っていますが、SQL2は2階層分しか結合しないので対象外です。

設問3(2)

RDBMSの仕様では、等値比較の述語の列が索引キーの先頭から連続していないと索引探索は選ばれません。SQL2では、L2の検索条件が子品番='P9'です。L1の結合条件もL1.子品番 = L2.親品番で、子品番に対する等値比較です。構成テーブルの主索引は(親品番,子品番)の順なので、子品番だけでは索引探索になりません。品目テーブルは品番(主索引)で結合するので問題ありません。そこで、子品番を先頭にした(子品番,親品番)のユニーク索引を追加します。親品番と子品番の組は主キーなので一意であり、ユニーク索引にできます。公式解答例も「子品番,親品番」です。採点講評では、主索引と同じ順番に列名を並べた誤った解答が散見されたと述べ、等値比較のローカル述語が指定された列を索引キーの先頭列にするのが索引設計の基本だと指摘しています。

設問4(1)

表4の手順③では、前の手順で引き当てた全部品についてSQL3を発行し、その1階層下の部品を調べます。品目区分が単体部品の品目は他の部品から組み立てられないので、子部品は存在しません。単体部品に対してSQL3を発行しても結果は0件です。手順①・③で品目区分を取得しておけば、単体部品に対するSQL3の発行を省略できます。公式解答例は「単体部品は子部品がないのでSQL3の発行は不要だから」です。30字以内で答えるには、①単体部品には子部品がないこと、②そのためSQL3の発行が不要になること、の2点を入れます。採点講評では、品目区分を利用すれば性能を効率化できることを理解してほしいとしています。

設問4(2)

指示2の例では、AXの構成でP2の子品目P3をP11に置き換えるべきところ、誤ってP1を登録しています。すると、P1→P2→P1→P2…という循環した親子関係ができます。SQL3は、HLLCに当該品目の一つ下のレベルを設定し、LLC>=:HLLCで絞り込みます。P1のLLCは1なので、レベル3以降に現れたP1は除外され、展開が止まります。この述語がないと、手順③〜⑤が同じ部品を繰り返し展開し続け、手順⑥に到達しません。公式解答例は「処理が無限ループして終わらない。」です。20字以内で答えるには、処理が循環して終了しないことを示します。採点講評では、ローレベルコードは部品の親子関係の矛盾を検知する目的で導入されると述べています。

設問4(3)

表4では、在庫の引当可能数をレベルごとに品番順に更新し、COMMITは手順⑥で行うため、更新した在庫行のロックは製品の処理が終わるまで保持されます。AXの更新順は、レベル1がP1、P4、P9、レベル2がP2(P9は既にロック済み)、レベル3がP3です。AZの更新順は、レベル1がP3、P7、P9、レベル2がP2、P4、レベル3がP3(ロック済み)です。ケース1は、AXのレベル1のP9とレベル3のP3、AZのレベル1のP3とP9の組で、更新順序が逆になる場合です。同様に見ると、AXはP4→P9の順(どちらもレベル1)、AZはP9(レベル1)→P4(レベル2)の順で更新します。AXがP4を、AZがP9をロックした状態で互いに相手の行を待つと、デッドロックになります。公式解答例の図では、AXのP4とレベル1のP9、AZのレベル1のP9とレベル2のP4に丸印を付けています。採点講評でも、在庫テーブルを更新する行の品番の順番に注目すれば、ケース1以外ではP4とレベル1のP9の組合せになると述べています。

設問4(4)

デッドロックの原因は、製品ごとにレベル単位で在庫行を更新するため、トランザクション間で更新する行の品番の順序がそろわないことです。Fさんの改良では、製品ごと部品ごとに集計した所要量で、手順⑥の前にSQL4をまとめて実行します。このとき、どの製品の処理でも同じ順序で行をロックするよう、SQL4を部品の品番順に実行すればデッドロックを避けられます。公式解答例は「SQL4を部品の品番順に実行する。」です。20字以内で答えるには、実行順序を品番順にそろえることを明示します。採点講評では、ケース1から、更新する行の品番の順番をそろえる方法を考えることで正答を導いてほしかったと述べています。

学習のポイント

自己結合で親子関係をたどる結合条件の向き、等値述語の列を索引の先頭に置く索引設計、階層ごとに更新するとロックの順序が製品ごとに異なってデッドロックが起きる仕組みと、品番順にそろえる回避策を重点的に復習してください。

出典:独立行政法人 情報処理推進機構(IPA)平成31年度春期 データベーススペシャリスト試験 午後Ⅰ 問3(公式資料:問題冊子(PDF) / 解答例 / 採点講評)

関連する過去問一覧

IPA Advancedは非公式の学習サイトです。解説にはAIによる補助生成を含む場合があります。公式の問題冊子・解答例・採点講評を優先し、誤りは確認後に訂正します。運営・編集方針