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

平成26年度春期 データベーススペシャリスト 午後Ⅱ 問1

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

問題

問1 データベースの物理設計に関する次の記述を読んで、設問1~3に答えよ。 証券会社のG社は、個人顧客(以下、顧客という)からインターネットによる国内株式の売買注文を受け付け、市場での取引を仲介し、売買代金、株式を管理している。G社では現在、株式取引管理システムを構築中で、構築を担当するシステム部が、データベースの論理設計を終え、テーブルと索引の設計と定義、データ格納領域の所要量(以下、データ所要量という)の見積り、データの配置などの物理設計に着手したところである。 〔データベースの論理設計〕 システム部が作成した概念データモデルを図1に、関係スキーマを図2に示す。また、図2の太枠内の関係について、主な属性の意味と制約を表1に示す。 図1 株式取引管理システムの概念データモデル 図2 株式取引管理システムの関係スキーマ(一部省略) 表1 主な属性の意味と制約 〔株式取引管理システムの主な処理〕 株式取引管理システムにおける主な処理は、次のとおりである。 1.顧客が行う処理 (1) 銘柄照会 銘柄コード又は銘柄名を指定すると、該当する銘柄の属性情報、取引される市場名及び株価チャートが表示される。株価チャートは、現在を起点とした過去の一定期間の値動きを示すグラフであり、縦軸を株価、横軸を時間(時分、日、週、月、四半期、年)とし、表示期間と表示間隔を選択できる。横軸の1目盛りで表される表示間隔は、表示期間によって決められていて、選択肢は表2のようになる。図3は、表示期間1日、表示間隔5分を選択したときの14:20現在の株価チャートの表示例である。 表2 株価チャートの表示期間と表示間隔の選択肢 図3 株価チャートの表示例 (2) 注文登録 売買希望銘柄コードを指定して、注文情報の登録又は変更を行う。登録した注文情報は、10年前の注文年月日から現在までの全注文について保存される。 2.G社の社員が行う処理 (1) 銘柄登録 銘柄情報の登録又は変更を行う。関係“銘柄詳細”には、変更の都度、有効開始年月日を付けて履歴が保存される。 (2) 業種別集計表作成 顧客に提供する情報の一つに、業種別集計表がある。業種別集計表は、作成時に指定した対象期間(開始年月日と終了年月日)内に、取引依頼年月日が含まれる取引について、“取引株数×取引値段”で求めた売買金額を、取引依頼年月日時点の株式発行企業の業種の大分類ごとに集計した帳票である。 3.株式取引管理システムが行う処理 (1) 株価更新 市場から株価データを取得して、データベースに格納する。株価は、銘柄ごと1分ごとに、その1分内に取引があれば、取引値段の始値、安値、高値、終値が記録される。 (2) 取引登録 顧客からの注文を受けて、取引情報の登録を行い、注文の内容を市場に送信する。市場での取引成立を受けて、取引情報を更新する。登録した取引情報は、10年前の取引依頼年月日から現在までの全取引について保存される。 (3) 決済情報登録 処理当日に成立した取引について、代金支払予定と株式の受渡予定を決済情報として登録する。また、月末日には、処理当日の3か月よりも前に決済された決済情報を削除する。 4.エンティティタイプと処理のCRUD 主なエンティティタイプと処理のCRUDをまとめると、表3のとおりである。 表3 主なエンティティタイプと処理のCRUD 〔RDBMSの仕様とストレージの構成〕 1.表領域 テーブル、索引などのストレージ上の物理的な格納場所を、表領域という。 (1) RDBMSがストレージとの間でデータの入出力を行う単位を、データページという。データページは、制御情報を格納するヘッダ部、テーブルのデータを格納するデータ部で構成される。表領域ごとに、ページサイズを2、000、4、000、8、000、16、000バイトのいずれかで指定し、空き領域率(将来の更新に備えて、データ部内に確保しておく空き領域の割合)を指定する。 (2) 同じデータページに、異なるテーブルの行が格納されることはない。可変長列のデータを更新するときに、同じデータページの空き領域が不足する場合は、その行は他のデータページに格納され、元のデータページ内に格納先へのポインタが設定される。 (3) テーブルの再編成を行うと、データ行がデータページに再配置されて、更新、削除によって生じたデータの断片化が修正され、空き領域が再度確保される。 (4) 表領域ごとに、バッファサイズ(データバッファに入る最大ページ数)を指定する。テーブルへの操作は、対象行がデータバッファにあればデータバッファ上で行われ、データバッファにない場合はストレージへの入出力が行われる。 2.テーブル (1) テーブルの列には、NOT NULL制約を指定することができる。NOT NULL制約を指定しない列には、1バイトのNULLかどうかを表すフラグが付加される。 (2) 主キー制約は、主キーを構成する列名を指定する。 (3) 参照制約は、列名、参照先テーブル名、参照先列名を指定する。制約に違反する行の追加と削除、列値の更新は拒否される。 (4) 検査制約は、同じ行の列に対する制約と、副問合せによる他のテーブルに対する制約を記述することができる。 (5) 使用可能なデータ型は、表4のとおりである。 表4 使用可能なデータ型 3.索引 (1) 索引には、ユニーク索引と非ユニーク索引がある。 (2) 索引には、クラスタ索引と非クラスタ索引がある。クラスタ索引は、キー値の順番とキー値が指す行の物理的な並び順が一致し、非クラスタ索引は、ランダムである。 4.アクセスパスと統計情報 (1) アクセスパスは、統計情報を基に、RDBMSによって表探索又は索引探索に決められる。表探索では、索引を使用せずに全データページを探索する。一方、索引探索では、検索条件に適した索引によって対象行を絞り込んだ上で、データページを探索する。 (2) 統計情報の更新は、テーブルごとにコマンドを実行して行う。統計情報の更新によって、適切なアクセスパスが選択される確率が高くなる。 5.ストレージの構成 RDBMSのデータを格納するストレージは、高速、中速、低速の三つのレイヤで構成されていて、各レイヤは複数の装置から成る。ストレージ管理システムによって、使用頻度の高い表領域ほど、高速なレイヤに格納される。 〔データベースの物理設計〕 システム部は現在、テーブルと索引の設計と定義、データ所要量の見積り、データの配置について検討している。 1.テーブル構造の検討 図2の関係スキーマを、そのままテーブルとして実装した場合の課題を検討した。その結果、業種別集計表作成の処理は、業種の大分類を求めるので、複数テーブルの結合処理に時間が掛かるのではないかとの懸念が示された。そこで、複数テーブルの結合処理における検索条件列とテーブルの検索順序を、次のように整理した。 手順1 検索条件の列として取引依頼年月日を指定し、“取引”テーブルを検索して、取引依頼年月日、取引株数、取引値段、注文番号を求める。その結果行ごとに、次の手順2~6を行う。 手順2 検索条件の列として注文番号を指定し、“注文”テーブルを検索して、銘柄コードを求める。 手順3 検索条件の列として【a】、【b】を指定し、【c】テーブルを検索して【d】を求める。 手順4 検索条件の列として【d】を指定し、【e】テーブルを検索して【f】を求める。 手順5 【f】がNULLならば、手順3で求めた【d】を得る。【f】がNULLでなければ、【f】を得る。 手順6 手順5で得た値ごとに“取引株数×取引値段”の値を累積する。 2.テーブル定義表の作成 次の方針に基づいて、テーブル定義を行う。作成中のテーブル定義表の一部を表5~7に示す。 (1) 関係名をテーブル名に、属性名を列名に読み替える。 (2) データ型欄には、データ型、データ型の適切な長さ、精度、位取りを記入する。データ型の選択は、次の規則に従う。 ① 文字列型の列が全角文字を含む場合はNCHAR又はNCHAR VARYINGを選択し、それ以外の場合はCHAR、VARCHARを選択する。 ② 文字列型の列が主キー又は索引を構成する場合は、CHAR又はNCHARのいずれかにし、それ以外の場合は、格納領域の長さが最小になるようにする。 ③ 整数の列は、取り得る値の範囲に応じて、SMALLINT又はINTEGERを選択する。それ以外の数値の列はDECIMALにする。 ④ 日付、時刻、時刻印の列は、専用のデータ型を選択する。 (3) NOT NULL欄には、NOT NULL制約がある場合はYを、ない場合はNを記入する。 (4) 格納長欄には、RDBMSの仕様に従って、格納長(見積り)を記入する。可変長文字列は、属性の意味と制約から平均文字数が分かる場合はそれを基準にし、分からない場合は最大文字数の半分を基準にする。 (5) 索引の種類と構成列欄には、作成する索引を記入する。 ① 主キーの索引は必ず作成する。 ② 値が一意となる列又は列の組合せには、必ずユニーク索引を作成する。それ以外の列又は列の組合せが、検索条件、結合条件に使用され、索引による性能向上を見込める場合に非ユニーク索引を作成する。 ③ 索引の種類には、P(主キーの索引)、U(ユニーク索引)、NU(非ユニーク索引)があり、いずれかを記入する。 ④ 索引の構成列には、定義順に1からの連番を記入する。 (6) 制約欄には、参照制約、検査制約をSQLの構文で記入する。 表5 作成中の“銘柄”テーブル定義表 表6 作成中の“株価”テーブル定義表 表7 作成中の“取引”テーブル定義表 3.データ所要量見積りと表領域へのデータ配置 主なテーブルのデータ所要量見積りとバッファサイズ設定を、表8にまとめる。テーブルのデータ所要量見積りは、データページのヘッダ部の長さを100バイトとして、次の手順①~④で行った。 手順① 表8から、見積行数、平均行長、ページサイズを得る。 手順② “(ページサイズ-100)×(1-空き領域率)÷平均行長”の小数点以下を切り捨てて、【g】を求める。 手順③ “【h】÷【g】”の小数点以下を切り上げて、【i】を求める。 手順④ “【i】×【j】”でデータ所要量を求める。 検討の結果、表8の各テーブルは、それぞれ異なる表領域に配置する。また、索引は、索引用の表領域に配置し、索引用のデータバッファ上で全てのキー値の検索が行えるように、十分なバッファサイズを設定する。 表8 主なテーブルのデータ所要量見積りとバッファサイズ設定(作成中) 〔物理設計のレビューと性能測定〕 システム部における物理設計のレビューで、銘柄照会の応答時間に懸念が示された。特に、株価チャートは、多くの顧客が頻繁に参照するので、応答時間について一定のサービスレベルを保証することが求められる。そこで、株価チャート表示の応答時間の試算と、テスト環境での性能測定を行うことにした。 1.応答時間の試算と改善案の検討 机上で応答時間を試算したところ、“株価”テーブルの検索時に、ストレージへのI/Oが集中し、求められる性能が得られないことが分かった。そこで、対策として次の二つの改善案を検討した。 案1 主キーの索引を、クラスタ索引に変更する。 案2 1分間隔でデータを格納するのではなく、株価チャートの表示期間と表示間隔に合わせて、時分、年月日、年週、年月などの間隔で集計したデータをそれぞれ別のテーブルに格納し、その全行をデータバッファに入れる。集計データの候補と見積行数を表9に示す。 表9 集計データの候補と見積行数 2.改善案の評価とテスト環境での性能測定 案1、2の応答時間の試算値を評価した結果、案2を採用することに決定し、テスト環境での性能測定を行った。案2実施後の応答時間の試算では、例えば、株価チャートにおいて、ある銘柄の1分間隔のデータは500行であり、バッファヒット率100%のとき、1行当たりの処理時間は0.01ミリ秒なので、検索処理時間は5ミリ秒と推定された。 設問1 〔データベースの物理設計〕の“テーブル構造の検討”について、(1)、(2)に答えよ。 (1) 手順3~5中の【a】~【f】に入れる適切なテーブル名又は列名を答えよ。 (2) (1)を踏まえて、テーブルへの列の追加によって検索効率を改善するために、表10の案A、Bについて検討することにした。案Bの“検索効率が上がる理由”を20字以内で、“他の処理の変更内容”を50字以内で述べよ。 表10 テーブル構造変更案の検討(未完成) 設問2 〔データベースの物理設計〕の“テーブル定義表の作成”及び“データ所要量見積りと表領域へのデータ配置”について、(1)~(4)に答えよ。 (1) 表5と表7の太枠内に適切な字句を入れ、表を完成させよ。 (2) 次の制約①と制約②は、データベースの論理設計と処理内容からデータベースへの実装が妥当でないと判断された。その理由をそれぞれ40字以内で述べよ。 制約① “注文”テーブルの注文株数は、対応する“銘柄”テーブル行の売買単位が指定されている場合は、その整数倍である(検査制約)。 制約② “取引”テーブルに、株式決済番号を参照列として、“決済”テーブルの決済番号を参照する(参照制約)。 (3) テーブルのデータ所要量見積り手順②~④中の【g】~【j】に入れる適切な字句を答えよ。また、表8中の【ア】、【イ】に入れる適切な値を答えよ。 (4) 表8では、“銘柄”テーブルの空き領域率を高めに設定している。この設定によって、“銘柄”テーブルの参照時及び更新時の検索対象ページ数を最小限にとどめる効果が期待される。その理由を50字以内で述べよ。 設問3 〔物理設計のレビューと性能測定〕について、(1)~(3)に答えよ。 (1) “応答時間の試算と改善案の検討”の案1で、主キーの索引をクラスタ索引に変更し、再編成することで、当初は、株価の検索効率が向上するが、一定期間経過後に悪化することが予想される。この二つの予想について、その根拠をそれぞれ40字以内で述べよ。 (2) “応答時間の試算と改善案の検討”の案2で、表9の集計データを組み合わせてテーブルに格納するに当たり、表11の①~④の組合せを考えた。これらの組合せのうち、表2の表示期間と表示間隔を漏れなく表示でき、他の集計データから求まる冗長なデータを保持せず、集計データの全行をデータバッファ上で検索できるようにするには、どの組合せが適切か。解答用紙の適否欄に、適切な組合せの場合は○を、適切でない組合せの場合は×を記入せよ。また、適切でない場合は、その理由を具体的に述べよ。ここで、集計データの平均行長は全て35バイト、ページサイズは4、000バイト、データバッファは30、000ページ、空き領域率は10%とする。 表11 テーブルに格納する集計データの組合せ (3) “改善案の評価とテスト環境での性能測定”において、性能測定の結果、集計データのテーブルの検索処理時間は5秒、バッファヒット率は100%、CPU使用時間は約5秒であった。試算値に対して、実測値が大幅に異なったことについて、考えられる原因とその対策を、それぞれ30字以内で述べよ。ここで、ハードウェアの障害、他の処理の影響はないものとする。
図1 株式取引管理システムの概念データモデル。市場、顧客、銘柄、注文、取引、株価、口座などのエンティティと、それらの関連を示す概念データモデル。
図1 株式取引管理システムの概念データモデル。市場、顧客、銘柄、注文、取引、株価、口座などのエンティティと、それらの関連を示す概念データモデル。
図2 株式取引管理システムの関係スキーマ(一部省略)。株式取引管理システムの関係と属性を、太枠内のテーブル設計対象範囲を含めて示した関係スキーマ。
図2 株式取引管理システムの関係スキーマ(一部省略)。株式取引管理システムの関係と属性を、太枠内のテーブル設計対象範囲を含めて示した関係スキーマ。
表1 主な属性の意味と制約。銘柄、業種、株価、注文、取引などの主な属性について、意味や値の範囲、制約を一覧で示した表。
表1 主な属性の意味と制約。銘柄、業種、株価、注文、取引などの主な属性について、意味や値の範囲、制約を一覧で示した表。
表2 株価チャートの表示期間と表示間隔の選択肢。株価チャートの表示期間ごとに選択可能な表示間隔を整理した表。
表2 株価チャートの表示期間と表示間隔の選択肢。株価チャートの表示期間ごとに選択可能な表示間隔を整理した表。
図3 株価チャートの表示例。表示期間1日、表示間隔5分における株価の時系列変動をローソク足で示したチャート。
図3 株価チャートの表示例。表示期間1日、表示間隔5分における株価の時系列変動をローソク足で示したチャート。
表3 主なエンティティタイプと処理のCRUD。銘柄照会、注文登録、銘柄登録などの処理と、顧客、口座、銘柄、株価、注文、取引などのCRUD関係を示す表。
表3 主なエンティティタイプと処理のCRUD。銘柄照会、注文登録、銘柄登録などの処理と、顧客、口座、銘柄、株価、注文、取引などのCRUD関係を示す表。
表4 使用可能なデータ型。CHAR、NCHAR、VARCHAR、整数、DECIMAL、日付、時刻などの使用可能なデータ型と格納サイズを示す表。
表4 使用可能なデータ型。CHAR、NCHAR、VARCHAR、整数、DECIMAL、日付、時刻などの使用可能なデータ型と格納サイズを示す表。
表5 作成中の“銘柄”テーブル定義表。銘柄テーブルの列、データ型、NOT NULL、格納長、索引、制約を記入するための未完成の定義表。
表5 作成中の“銘柄”テーブル定義表。銘柄テーブルの列、データ型、NOT NULL、格納長、索引、制約を記入するための未完成の定義表。
表6 作成中の“株価”テーブル定義表。株価テーブルの列定義、主キー索引、データ型、格納長、外部キー制約を示す定義表。
表6 作成中の“株価”テーブル定義表。株価テーブルの列定義、主キー索引、データ型、格納長、外部キー制約を示す定義表。
表7 作成中の“取引”テーブル定義表。取引テーブルの列、データ型、NOT NULL、格納長、索引、検査制約、外部キー制約を示す未完成の定義表。
表7 作成中の“取引”テーブル定義表。取引テーブルの列、データ型、NOT NULL、格納長、索引、検査制約、外部キー制約を示す未完成の定義表。
表8 主なテーブルのデータ所要量見積りとバッファサイズ設定(作成中)。銘柄、銘柄詳細、株価、注文、取引について、行数、平均行長、ページサイズ、空き領域率、バッファサイズ、データ所要量を示す表。
表8 主なテーブルのデータ所要量見積りとバッファサイズ設定(作成中)。銘柄、銘柄詳細、株価、注文、取引について、行数、平均行長、ページサイズ、空き領域率、バッファサイズ、データ所要量を示す表。
表9 集計データの候補と見積行数。株価を1分、15分、1日、1週間、1か月、1四半期、1年間隔で保持する候補と、それぞれの見積行数を示す表。
表9 集計データの候補と見積行数。株価を1分、15分、1日、1週間、1か月、1四半期、1年間隔で保持する候補と、それぞれの見積行数を示す表。
表10 テーブル構造変更案の検討(未完成)。取引テーブルへの銘柄コード又は大分類の業種コード追加について、変更内容と検索効率、他処理の変更を検討する表。
表10 テーブル構造変更案の検討(未完成)。取引テーブルへの銘柄コード又は大分類の業種コード追加について、変更内容と検索効率、他処理の変更を検討する表。
表11 テーブルに格納する集計データの組合せ。表9の集計データ番号を組み合わせた四つの格納候補を示す表。
表11 テーブルに格納する集計データの組合せ。表9の集計データ番号を組み合わせた四つの格納候補を示す表。
解き方のヒントを見る

設計判断の根拠を問題文の条件に求める

物理設計の問題では、一般論として正しそうな考えよりも、問題文に示された業務の特徴や前提条件と結び付くかどうかが判断の分かれ目になります。各判断について、根拠となる記述を問題文中で探す習慣をつけましょう。

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

確認すべき観点は一つ、各判断が問題文中のどの前提条件(業務の特徴、データの性質、運用上の制約など)に裏付けられているかです。条件と結び付けられない判断は、一般論に頼っていないか見直してください。

視点

物理設計では、同じ手法でも前提となる条件次第で適否が変わります。そのため『この手法は一般に有効か』ではなく『この問題の前提で有効か』と問い直して考えることが大切です。数量や頻度、時間帯などの条件が示されている場合は、それが判断のどこに効いてくるかを意識しながら読み進めましょう。

確認ポイント

  • 判断の根拠となる前提条件を問題文中から具体的に指し示せるか
  • 一般論としての妥当性と、問題の前提の下での妥当性を区別して考えているか
  • 示された数量・頻度・制約などの条件を読み飛ばしていないか
正解と解説を見る

解説

証券会社の株式取引管理システムを題材に、論理設計の結果を物理設計へ落とし込む問題です。業種別集計の結合手順の整理と、導出データを持たせる非正規化、データ型・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による補助生成を含む場合があります。公式の問題冊子・解答例・採点講評を優先し、誤りは確認後に訂正します。運営・編集方針