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














解き方のヒントを見る
設計判断の根拠を問題文の条件に求める
物理設計の問題では、一般論として正しそうな考えよりも、問題文に示された業務の特徴や前提条件と結び付くかどうかが判断の分かれ目になります。各判断について、根拠となる記述を問題文中で探す習慣をつけましょう。
この問題で問われていること
確認すべき観点は一つ、各判断が問題文中のどの前提条件(業務の特徴、データの性質、運用上の制約など)に裏付けられているかです。条件と結び付けられない判断は、一般論に頼っていないか見直してください。
視点
物理設計では、同じ手法でも前提となる条件次第で適否が変わります。そのため『この手法は一般に有効か』ではなく『この問題の前提で有効か』と問い直して考えることが大切です。数量や頻度、時間帯などの条件が示されている場合は、それが判断のどこに効いてくるかを意識しながら読み進めましょう。
確認ポイント
- 判断の根拠となる前提条件を問題文中から具体的に指し示せるか
- 一般論としての妥当性と、問題の前提の下での妥当性を区別して考えているか
- 示された数量・頻度・制約などの条件を読み飛ばしていないか
正解と解説を見る
解説
証券会社の株式取引管理システムを題材に、論理設計の結果を物理設計へ落とし込む問題です。業種別集計の結合手順の整理と、導出データを持たせる非正規化、データ型・NOT NULL・格納長・索引の決定、実装に向かない制約の見極め、データ所要量の見積り、空き領域率の意味、クラスタ索引と集計テーブルによる性能改善、統計情報に起因する性能問題の分析までを一貫して問っています。
問題の全体像
G社は株式取引管理システムの論理設計を終え、物理設計(テーブルと索引の定義、データ所要量の見積り、データ配置)に取り組んでいます。出題趣旨では、①非正規化や導出データの保存を行いながらテーブルを設計する能力、②列のデータ型とサイズ・索引を決めてデータベースオブジェクトとして定義する能力、③データ所要量を見積もってストレージに配置する能力、④性能を測定・評価する能力の四つを評価するとしています。採点講評によると、テーブルと索引の設計に関する設問の正答率は高かった一方で、性能改善の対策と性能評価に関する設問の正答率は低かったとのことです。
設問1(1)
業種別集計表は「取引依頼年月日時点の業種の大分類」で集計します。表1を見ると、業種コードは有効開始年月日時点の値として銘柄詳細に記録されています。そのため手順3では、銘柄コードと有効開始年月日を検索条件にして銘柄詳細を検索し、取引依頼年月日時点で有効な業種コードを求めます。業種は大分類と小分類の2階層で、上位業種コードは小分類にだけ指定されます。したがって手順4では業種コードで業種テーブルを検索して上位業種コードを求め、手順5で「上位業種コードがNULLなら業種コード自体が大分類、NULLでなければ上位業種コードが大分類」と判定します。公式解答例では、a=銘柄コード、b=有効開始年月日(aとbは順不同)、c=銘柄詳細、d=業種コード、e=業種、f=上位業種コードです。
設問1(2)(a)
案Bでは、取引テーブルに大分類の業種コードをあらかじめ持たせます。こうすると、手順1で取引行を取り出した時点で集計キーが手に入るため、注文→銘柄詳細→業種とたどる結合が要らなくなります。公式解答例では「手順2~5の検索を省略できるから」としています。案Aは手順2だけを省略する案なので、案Bでは省略できる範囲が手順2~5に広がる点を押さえます。採点講評でも、不要になる手順を正確に指摘できた解答が少なかったと述べられています。
設問1(2)(b)
導出データを持たせたら、その値を誰がいつ設定するかを決める必要があります。案Aの記述と同じ形で考えると、取引情報を登録する処理(取引登録)で、手順2~5と同様の検索によって大分類の業種コードを求め、取引テーブルに転記することになります。業種は取引依頼年月日時点の値で確定するので、登録時に転記すれば集計の要件を満たせます。公式解答例では「取引登録に、手順2~5と同様の検索で求めた業種コードを“取引”テーブルに転記する処理を追加する」としています。答案には「取引登録」「手順2~5と同様の検索」「業種コードの転記」の三つを入れます。
設問2(1)
表5(銘柄)の公式解答例は次のとおりです。
・銘柄コード:CHAR(4)、Y、4、P1
・銘柄名:NCHAR(30)、Y、60、U1(一意で索引を作る全角文字列なので固定長のNCHAR)
・上場区分:CHAR(1)、Y、1
・売買単位:INTEGER、N、5(上限が1、000、000でSMALLINTの範囲を超えるためINTEGER。定めがない銘柄があるのでN。4バイトにNULLフラグ1バイトを加える)
・公開情報:NCHAR VARYING(1200)、N、1、005(平均500字×2+制御情報4+NULLフラグ1)
・市場コード:CHAR(5)、Y、5
索引欄の見出しはPとUです。
表7(取引)のNOT NULL欄は、注文番号・取引依頼年月日・取引状態がY、取引成立年月日・取引株数・取引値段・代金決済番号・株式決済番号がNです(取引が成立・決済するまで値が決まらないため)。採点講評では、全角文字の長さとNULLフラグを勘案して格納長を求めた解答が少なかったと指摘されています。
設問2(2)(制約①)
表1によると売買単位は変更されることがあり、注文は10年分保存されます。売買単位を変更すると、過去の注文の注文株数が新しい単位の整数倍にならず、検査制約に違反する行が生まれてしまいます。つまり、この制約を実装すると売買単位の変更自体ができなくなります。公式解答例では「“銘柄”テーブルの売買単位を変更することができなくなるから」としています。
設問2(2)(制約②)
決済情報登録では、処理当日の3か月より前に決済された決済情報を月末日に削除します。一方、取引情報は10年分保存されます。このため、取引テーブルの株式決済番号が決済テーブルに存在しない状態が生じます。また参照制約を付けると、取引テーブルを更新しない限り決済行を削除できません。公式解答例では、この二つの観点を理由として示しています。採点講評では「株式決済番号がNULLになる」ことを理由に挙げた解答が散見され、参照制約への理解が不十分だと指摘されています。NULLは参照制約違反にならないため、理由として不適切です。
設問2(3)
手順②は1ページに入る平均行数(g)、手順③は見積行数(h)÷gを切り上げた必要ページ数(i)、手順④は必要ページ数×ページサイズ(j)の計算です。
アは設問2(1)で求めた格納長の合計で、4+60+1+5+1、005+5=1、080バイトです。
イは次のように計算します。(16、000-100)×(1-0.3)÷1、080=10.3…で、切り捨てて1ページ10行。10、000÷10=1、000ページ。1、000×16、000=16、000、000バイトなので16、000千バイトです。
公式解答例も、g=1ページの平均行数、h=見積行数、i=必要ページ数、j=ページサイズ、ア=1、080、イ=16、000です。銘柄詳細の行(2、666、672千バイト)で検算すると、計算手順が正しいことを確認できます。
設問2(4)
公開情報は随時更新される可変長列です。仕様では、更新時に同じページの空き領域が足りないと行が別のページへ移され、元のページにはポインタが残ります。空き領域率を高くしておけば、更新後の値が同じページに収まりやすくなります。その結果、行の移動が起きにくく、参照でも更新でも1ページだけを探索すれば済みます。公式解答例では「更新後の公開情報の列値が、同じデータページ内に格納される確率が高くなるから」としています。採点講評でも、可変長列の更新によるページの連鎖を防ぐ点に着目することが求められています。
設問3(1)(検索効率向上)
クラスタ索引にして再編成すると、行が主キー(銘柄コード、株価年月日、株価時分)の順に物理的に並びます。株価チャートは、ある銘柄の連続した時刻の行を読むので、それらの行が同じページにまとまり、読むページ数が減ってバッファヒット率が上がります。公式解答例では「同一ページ内で検索順に行が連続し、バッファヒット率が高くなるから」としています。採点講評では、クラスタ索引の特性を述べるだけの解答が多かったとされているので、チャート検索のアクセスパターンと結び付けて書きます。
設問3(1)(検索効率悪化)
株価は全銘柄について1分ごとに追加されますが、キーの先頭は銘柄コードです。そのため新しい行はキー順の位置に連続して格納できず、再編成で整えた配置が時間とともに崩れていきます。公式解答例では「データページへのデータ配置が断片化して、探索対象となるデータページが増えるから」としています。
設問3(2)(①)
判定の前提として、1ページの行数は(4、000-100)×0.9÷35=100.2…で100行です。したがって、データバッファ30、000ページに入るのは300万行までです。①(1、2、4)の合計は50万+70万+3、000万=3、120万行で、31万2、000ページが必要になります。公式解答例では×とし、理由を「データバッファに全てのデータページが入らないから」としています。
設問3(2)(②)
②(1、2、5、7)には、11日前から1年前までの1日間隔のデータがありません。1週間隔(5)や1か月間隔(7)からは、より短い1日間隔のデータを作れません。そのため、表2の表示期間1か月~1年のうち、表示間隔1日を表示できません。公式解答例では×とし、理由を「表示期間1か月から1年で、表示間隔1日の検索ができないから」としています。
設問3(2)(③)
③(1、2、3、6、8)の合計は285万行で2万8、500ページとなり、バッファに収まります。各表示期間に必要な最小間隔のデータもそろっています。
・1~2日:1分間隔(1)
・3~10日:15分間隔(2)
・1年まで:1日間隔(3)
・5年まで:1か月間隔(6)
・30年まで:1四半期間隔(8)
より長い間隔は注記1のとおり集計で求められ、冗長なデータも持っていません。公式解答例では○です。
設問3(2)(④)
④は③に9(1年間隔)を加えた組合せです。1年間隔のデータは1四半期間隔のデータ(8)を集計すれば作れるため、他の集計データから求まる冗長なデータを持つことになります。公式解答例では×とし、理由を「1年間隔は1四半期間隔から導出できるから」としています。
設問3(3)(原因)
試算では500行×0.01ミリ秒=5ミリ秒のはずが、実測は5秒で約1、000倍でした。バッファヒット率は100%でCPU使用時間も約5秒なので、ストレージのI/Oではなく、処理した行数が想定よりはるかに多いと読み取れます。5秒÷0.01ミリ秒=50万行で、これは1分間隔テーブルの全行数に当たります。つまり、索引が使われずに表探索で全行を読んでいたと推察できます。公式解答例では「索引が使用されず表探索によって全行が読み込まれている」としています。採点講評では、データベース以外の観点からの解答が散見されたと指摘されています。
設問3(3)(対策)
仕様では、アクセスパスは統計情報を基に決まり、統計情報を更新すれば適切なアクセスパスが選ばれる確率が高くなります。新しく作った集計テーブルの統計情報が実態を反映していないことが原因と考えられるため、公式解答例では「集計データを格納したテーブルの統計情報を更新する」を対策としています。
学習のポイント
RDBMSの仕様(格納長、NULLフラグ、行の移動、クラスタ索引の断片化、統計情報とアクセスパス)を数値計算と結び付けて説明できるようにすることが重点です。
出典:独立行政法人 情報処理推進機構(IPA)平成26年度春期 データベーススペシャリスト試験 午後Ⅱ 問1(公式資料:問題冊子(PDF) / 解答例 / 採点講評)
関連する過去問一覧
IPA Advancedは非公式の学習サイトです。解説にはAIによる補助生成を含む場合があります。公式の問題冊子・解答例・採点講評を優先し、誤りは確認後に訂正します。運営・編集方針