DBデータベーススペシャリスト試験 午後Ⅱ
平成31年度春期 データベーススペシャリスト 午後Ⅱ 問1
事例を読んで設問の答えを考えてから、解説のポイントとIPA公式の解答例・採点講評で確認しましょう。
問題



















解き方のヒントを見る
処理の読み方と設計の対応を確かめる
性能を問う設計の検討では、処理がどの条件でデータを探し、どれだけの量を読むのかを先に整理します。そのうえで、各設計要素がその読み方に合っているかを、与えられた記述に沿って一つずつ照らし合わせてください。
この問題で問われていること
着目する観点は、処理がデータへたどり着く経路の一つだけです。記述された処理の条件や頻度をもとに、その処理がどのデータをどの順でたどるかを自分の言葉で書き出し、設計の意図と結び付けてから判断してください。
視点
データベースの性能は、設計上の工夫があるかどうかだけでは決まりません。その工夫が実際の処理の読み方と噛み合っているかどうかで決まります。処理の条件が変われば、同じ設計でも評価は変わり得ます。そのため、一般論の暗記に頼らず、与えられた前提から処理の流れを組み立て直して評価することが大切です。
確認ポイント
- 対象となる処理が、どの項目の条件でデータを絞り込んでいるかを記述から拾い出したか
- その処理が読む範囲や件数、実行の頻度について、与えられた前提を確認したか
- 判断の根拠が一般論ではなく、書き出した処理の経路と設計要素との対応に基づいているか
正解と解説を見る
解説
B銀行のログ分析システムを題材に、参照テーブルの洗い出し、権限レベルに応じたSQL、ウインドウ関数や連番を使った直前ログとの結合を扱います。さらに、木構造を表すテーブル構造3案の比較、物理分割案の性能評価、シェアードナッシング型クラスタでのデータ配置見直しまで、RDBMSの仕様に基づいて一貫して評価させる問題です。
問題の全体像
B銀行は、窓口端末のログを60か月分蓄積し、障害調査・監査・事務手続改善・AP改善に活用するログ分析システムを構築します。データを格納するテーブルは、ログ収集・ログ基本・ログ明細・ログ関連とマスタ類です。問題文には、オプティマイザの仕様、再帰問合せ、ウインドウ関数、物理分割(ハッシュ/レンジ、ローカル索引、区分削除コマンド)、シェアードナッシング型クラスタ(分散/複製)という仕様が示されています。設問1は問合せの設計、設問2は木構造を格納するログ関連テーブルの構造比較、設問3は物理分割とクラスタ構成の評価です。出題趣旨では、要求の整理、テーブル設計、区分化の設計、データ操作の設計、アクセス性能の見積りといった能力を評価するとされています。採点講評では、設問3の正答率が全体的に低く、特にローカル索引の列名とクラスタ構成の仕様理解に不十分な解答が見られたと指摘されています。
設問1(1)
表2の処理5と処理6の出力項目と集計キーを、図1のどの列から得るかを追います。
・処理5:店番と端末種別コードごとに明細件数(ログ基本の列)を集計し、店名と端末種別名を出力します。店名は支店から取ります。ログ基本には端末種別コードがないので、店番・機番で窓口端末を結合して端末種別コードを得て、さらに端末種別から端末種別名を取ります。
・処理6:画面番号を指定し、店名と取引種別名ごとに明細件数を集計して、タイトルも出力します。タイトルは画面、店名は支店から取ります。取引種別名は、ログ基本の取引番号から取引を経由して取引種別へたどります。
このため公式解答例では、処理5は支店・端末種別・窓口端末、処理6は支店・取引種別・取引・画面に○を付けています。
設問1(2)
表5には、マスタテーブルのうち、処理1〜6の結合で使う主キー以外の列を挙げます。処理5では、窓口端末の端末種別コード(外部キー)で端末種別と結合します。処理4と処理6では、取引の取引種別コードで取引種別と結合します。公式解答例では、窓口端末の端末種別コードと、取引の取引種別コードの2行が答えです。
設問1(3)(a)
処理1の権限レベル'1'は「所属支店かつ本人のログ」、'2'は「所属支店のログ」、'3'は「全ログ」を対象にします。店番で絞り込む必要があるのはレベル'1'と'2'です。そのため検索店番に所属店番を入れる条件は、公式解答例のとおりIN('1'、'2')になります。レベル'3'ではNULLになります。
設問1(3)(b)
本人のログだけに絞るのはレベル'1'だけです。そのため検索行員番号に行員番号を入れる条件は、公式解答例のとおり= '1'です。それ以外のレベルではNULLになり、行員番号での絞込みは行われません。
設問1(3)(c)
a・bでNULLにした検索店番や検索行員番号は、「絞り込まない」ことを表します。そのためWHERE句は「検索店番がNULLである、または検索店番がA.店番と一致する」という形にします。公式解答例ではIS NULLです。レベル'3'では両方ともNULLになるので、年月の条件だけで全ログが対象になります。
設問1(3)(d)
処理2は、前画面番号・後画面番号・平均経過時間を「平均経過時間の降順に出力する」と定めています。図3〜5はいずれもGROUP BYで終わっていて、並べ替えがありません。そのため公式解答例ではORDER BY 平均経過時間 DESCを補います。
設問1(4)
図5では、店番・機番が等しく、かつ(A.ア - 1) = B.アという条件でBを結合しています。これでBを「同じ窓口端末でTS順の直前のログ」にするには、アの列に、店番・機番・TSの順に並べたときに1ずつ増える連続した整数を事前に設定しておく必要があります。公式解答例は「店番,機番,TSの順に連続する整数」(17字)です。採点講評では、「画面遷移の連番」のように連番を付ける単位を考慮していない誤答が見られたと指摘されています。SQL中の結合条件から処理の単位(店番・機番ごとのTS順)を読み取ることが重要です。
設問2(1)(e)
問合せ[B]は、「ログID='105'及びその上位」を求めます。再帰問合せの非再帰部(起点)では、起点となるログを1行取り出します。そのため公式解答例ではログID = '105'です。
設問2(1)(f)
再帰部では、TEMP B(すでに求めたノード。最初は105)の親をログ関連Aから探します。ある行の親は、その行の親ログIDをログIDにもつ行です。したがって条件は「A.ログID = B.親ログID」で、公式解答例では空欄fはB.親ログIDです。この条件で、Bの親ログIDと同じログIDをもつ行Aが上位ノードとして見つかります。Aの行(ログIDと親ログID)はTEMPに追加されて、次の繰返しでBになります。表7の例では、105の親ログID(103)から103が、103の親ログID(101)から101が見つかります。101の親ログIDはNULLなので一致する行がなく、再帰はそこで終わります。問合せ[A]は下位方向をたどるので条件がA.親ログID = B.ログIDになっており、上位方向の[B]とは等号の左右の列の役割が逆になっている点に注意します。
設問2(1)(g)
案3では、上位ノードの区間(左端番号〜右端番号)が下位ノードの区間を含みます。問合せ[A]では、A(101)の区間に含まれるBを求めていました。[B]は、A(105)を含む区間をもつBを求めるので、比較の向きが逆になります。公式解答例では、gとhは順不同で、A.左端番号 >= B.左端番号とA.右端番号 <= B.右端番号です。等号を含めることで、105自身も結果に含まれます。
設問2(1)(h)
g・hの2条件は順不同で、両方がそろって「Bの区間がAの区間を包含する」ことを表します。表9で確かめると、105(7、8)に対して101(1、12)、103(4、11)、105自身が条件を満たします。一方、102(2、3)は右端番号3が8より小さいので除外されます。公式解答例のhはA.右端番号 <= B.右端番号です。
設問2(2)(i)
案2では、各行の経路に、ルートからそのノードまでの全ログIDが入っています。199を101と103の間に挿入すると、経路に「101/103」を含む行はすべて「101/199/103…」に書き換えが必要です。対象は、103(101/103)と、その下位の104(101/103/104)・105(101/103/105)・106(101/103/106)です。追加する199の行以外の更新行数は、この4行です。したがって公式解答例のとおり4です。102、107〜109の経路は変わりません。
設問2(2)(j)
案3で199を挿入した後に番号を付け直すと、次のようになります。101(1、14)、102(2、3)、199(4、13)、103(5、12)、104(6、7)、105(8、9)、106(10、11)、107(15、20)、108(16、17)、109(18、19)。番号は表全体で連続する一意な値なので、別の木の107〜109も2ずつずれます。値が変わらないのは102だけです。したがって、101・103・104・105・106・107・108・109の8行が更新されます(公式解答例:8)。採点講評では、jは正答率が低かったとされ、具体的な値で検証する習慣を付けるよう求めています。
設問2(2)(k)
更新行数は案1が1行、案2が4行、案3が8行で、案3の負荷が最も高くなります。公式解答例では3です。
設問2(2)(l)
本文の「3. ログ分析システムのテーブル(1)」に、ログは「新たに発生したログを追加するだけで,更新は行わない」と書かれています。一度作った木構造が後から変更されることはないので、変更時の負荷は問題になりません。本文中の用語を使い、公式解答例では「更新は行わない」です。
設問2(2)(m)
処理3では、操作の分岐に従ってツリー形式で表示します。案1(親ログID方式)では、任意の深さの子孫をたどるために、表10の案1のようにWITH RECURSIVEを使う必要があります。RDBMS仕様の見出しの用語で、公式解答例では「再帰的な問合せ」です。
設問2(2)(n)
案2・案3では、表10のとおり、ログ関連どうし(とログ基本などの)を結合し、条件で選択して列を射影するだけで木全体を取り出せます。そのため公式解答例では、関係演算は「結合」です。
設問2(3)
表10を見ると、案2の問合せ[A]はLIKE '101%'の前方一致なので、オプティマイザ仕様(1)により索引探索になります。そのため、案3(左端番号・右端番号の索引を使える比較条件)とほぼ同等です。一方、問合せ[B]の案2はWHERE句にPOSITION関数を含むため、仕様(2)により表探索になります。公式解答例は「WHERE句の述語が関数を含む場合,表探索になるから」です。採点講評でも、アクセスパスの違いによって性能差が生じることを理解しているかが問われたとされています。
設問3(1)(①)
案CはTSの年月でレンジ分割しています。新しく発生したログは、すべて当月の1区分に追加されます。格納処理はログファイルごとに並行して実行されるので、追加が1区分に集中して待ちが発生します。一方、案A・Bは複数の区分に分散して追加できます。公式解答例は「一つの区分に行追加が集中し,待ちが発生するから」です。
設問3(1)(②)
ログ収集テーブルへの参照は、利用者が店番・機番・TSの範囲を指定する問合せ(処理3など)に限られます。案A〜Cのローカル索引はいずれも店番・機番・TSの3列で構成されているので、どの案でも索引を使って対象行に絞り込めます。そのため参照性能の評価に差が付きません。公式解答例は「検索キーが店番,機番,TSに限られるから」です。
設問3(2)(o)
処理5は、1か月分・全店番が対象で、検索条件は年月です。案Dはログのハッシュで区分しているため、年月では区分を特定できず、60区分すべてを探索します。公式解答例では60です。
設問3(2)(p)
案Dのローカル索引は{ログID}と{店番、機番、年月、ログID}です。処理5では、どちらの先頭列(ログIDや店番)も指定されないので、索引で区分内を絞り込めず表探索になります。探索ページ数はテーブル全体の60Mです(公式解答例:60M)。処理4で30、000ページになるのは、店番を指定するので索引を使えるからで、処理5との違いに注意します。
設問3(2)(q)
処理6は、前々年4月から前年3月までの12か月分が対象です。案Fは年月ごとのレンジ分割なので、探索するのは12区分です(公式解答例:12)。
設問3(2)(r)
案Fのローカル索引は{年月、ログID}です。1区分の中では年月はすべて同じ値なので、索引を使っても絞り込めません。条件の画面番号も索引に含まれません。そのため12区分をすべて読み、1区分1M×12で12Mページになります(公式解答例:12M)。
設問3(2)索引
ローカル索引は、区分キー列(店番)をすべて含む必要があります。また、区分内を索引で探索するには、先頭列を指定する必要があります。処理4(店番1つ・6か月)と処理5(全店番・1か月)のどちらでも指定されるのは年月なので、年月を先頭にして{年月、店番}とします。すると、処理4は1区分の中で6か月分に、処理5は60区分それぞれで1か月分に索引で絞り込めます。どちらも30、000ページまで減らせます。公式解答例では「年月,店番」です。採点講評では、この列名の正答率が低かったとされ、検索条件を正確に把握して索引を設計するよう求めています。
設問3(3)(①)
主キー列を分散キーにすると、ログ基本はログID、ログ明細は(ログID、明細番号)、取引は取引番号、取引種別は取引種別コードで、それぞれ別々にハッシュ分散されます。処理4はこれら4テーブルを結合するので、結合相手の行が別のノードにあることが多くなります。RDBMS仕様6(3)のとおり、結合するたびに他ノードへ処理を依頼するため、ノード間通信のオーバーヘッドが発生します。公式解答例は「結合対象のデータが各ノードに分散しており,テーブル結合を行うごとにノード間通信が必要となるから」です。
設問3(3)(②)
取引種別と取引はマスタ情報で、データ量が少なく、更新も月1回です。そのため、全ノードにテーブルの複製を持たせれば、どのノードでも自ノード内で結合できます。公式解答例は「データの配置方法に複製を指定する。」です。
設問3(3)(③)
ログ基本はログIDで分散されています。一方、ログ明細は(ログID、明細番号)で分散されるため、同じログIDの明細が複数のノードに散らばります。分散キーをログIDだけにすれば、同じログIDのログ基本とログ明細が同じノードに置かれ、結合を自ノード内で処理できます。ログIDは主キーの一部なので、分散キーの制約も満たします。公式解答例は「分散キーをログID列だけに変更する。」(または「分散キーから明細番号列を除外する。」)です。
学習のポイント
RDBMSの仕様(関数を含む述語は表探索になること、ローカル索引の先頭列、区分の削除コマンド、分散キーと複製)を根拠にして、具体的な値で行数やページ数を試算する練習をすることが重点です。
出典:独立行政法人 情報処理推進機構(IPA)平成31年度春期 データベーススペシャリスト試験 午後Ⅱ 問1(公式資料:問題冊子(PDF) / 解答例 / 採点講評)
関連する過去問一覧
IPA Advancedは非公式の学習サイトです。解説にはAIによる補助生成を含む場合があります。公式の問題冊子・解答例・採点講評を優先し、誤りは確認後に訂正します。運営・編集方針