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

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

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

問題

問1 データベースの実装に関する次の記述を読んで、設問1~3に答えよ。 A社は、事務機器、オフィス家具、事務用品などの企業向けオフィスサプライ商品を販売している。A社では、取扱商品の多様化と受注数の増加に対応し、販売管理業務の効率向上を図るために、販売管理システムを再構築することにした。 〔A社の組織概要〕 (1) A社に商品を発注し購入している企業を顧客という。顧客には、企業単位に一意な顧客番号が付与されている。 (2) A社は、メーカから商品を仕入れて販売している。メーカには、一意なメーカコードが付与されている。 (3) A社には、本社と、販売業務を行う全国15か所の事業所がある。本社では、商品の選定、事業所の管理などを行っているが、販売業務は行っていない。本社及び事業所には、一意な事業所コードが付与されている。 (4) 事業所の担当地域内には、一つ以上の物流センタがあり、在庫管理と商品配送を行っている。物流センタには、一意な物流センタコードが付与されている。 (5) 社員は、本社又は一つの事業所に所属し、本社と事業所間又は事業所間の異動がある。社員には、一意な社員番号が付与されている。 〔商品の概要〕 (1) 約20、000アイテムの商品を、メーカから仕入れて販売している。商品には、一意な商品コードが付与されている。 (2) 商品は、商品分類コードによって分類されている。 (3) 商品によっては、返品可能なものがある。 (4) 商品は、色、柄、サイズ、パッケージの違いなどによって、在庫管理の単位であるSKUに細分化されている。SKUには、一意なSKUコードが付与されている。 〔受注と出荷指示〕 (1) 顧客は、商品カタログから商品を選択し、ファックス又は電子メールでA社の事業所あてに注文書を送付する。同じ顧客が、複数の事業所に注文を行うこともある。 (2) 注文書単位に注文を受け付ける。受注担当者は、注文書に記載された一つ以上のSKUについて、在庫があることを確認して受注伝票を作成する。受注伝票ごとに、一意な受注番号が付与される。 (3) 受注内容を確認し、出荷伝票を作成する。出荷伝票ごとに一意な出荷番号が付与される。 〔受注の取消と返品〕 (1) 顧客は、商品出荷前の注文を取り消すことができる。取消は注文書単位に行い、特定のSKUの注文だけを取り消すことはできない。 (2) 顧客は、返品可能な商品に限り返品することができる。ただし、納品後10日以内にA社の物流センタに到着することが条件となる。 (3) 取消又は返品があれば、受注数量及び出荷数量をすべてマイナスにした受注伝票及び出荷伝票(以下、赤伝という)を新たに作成する。さらに、一部のSKUだけが返品された場合は、返品されたSKUを除く受注伝票及び出荷伝票(以下、黒伝という)を新たに作成する。 (4) 返品された商品は、商品の状態に応じて、在庫に戻されるか、又は処分される。 〔代金の請求〕 (1) 事業所では、月初日から月末日までに納品が済んだ受注を確認して、月締めを行う。事業所によって月締めのタイミングは異なるが、翌月の第15営業日までには前月分の月締めを行う規則になっている。 (2) 事業所では、顧客ごとに、月締めの対象月中に納品が済んだ受注の受注金額と消費税額を合計して請求金額を求め、請求書を作成して顧客に送付する。あわせて、請求金額を未収金額に計上する。請求書には、顧客番号と振込先口座番号も記載されている。振込先口座番号は、事業所ごとに異なっている。 〔入金の確認〕 (1) 顧客は、請求書に記載されている請求年月日の翌月の月末日までに、請求金額を銀行振込によって支払う。その際、振込人欄に請求書に記載された顧客番号を記入する。 (2) 各事業所の請求担当者は、銀行から入金情報(振込人、入金日、入金金額)を取得する。振込人欄に記載された顧客番号で、当該顧客の請求済で未入金の請求書と照合して、次のように消込みを行う。 ① 入金金額を未消込金額に設定し、ゼロを不足金額に設定する。 ② 請求年月日の古いものから順に、最新の請求まで、次のいずれかを行う。 ・未消込金額が未収金額以上の場合、未消込金額から未収金額を差し引いた額を未消込金額に設定し、未収金額を消込金額として記録する。未収金額にゼロを設定する。 ・未消込金額がゼロよりも大きく、かつ、未消込金額が未収金額よりも小さい場合、未収金額から未消込金額を差し引いた額を、不足金額と未収金額に設定し、未消込金額を消込金額として記録する。未消込金額にゼロを設定する。 ・未消込金額がゼロの場合、不足金額に未収金額を加算する。 (3) 消込みの結果、顧客ごとの不足金額がゼロより大きければ、不足金額の支払を求める。また、顧客ごとの未消込金額がゼロより大きければ、未消込金額を返金する。 〔損金処理〕 請求後1年以内に回収できない請求は、未収金額をゼロにして損金処理を行う。 〔販売管理業務の流れとその概要〕 販売管理業務の流れを図1に、各業務の概要を表1に示す。ただし、損金処理を除く。 図1 販売管理業務の流れ 表1 各業務の概要 〔主な帳票とその概要〕 販売管理システムで用いられる主な帳票とその概要を、表2に示す。表2の各帳票の例を、それぞれ図2~4に示す。 表2 主な帳票とその概要 図2 未収金集計表の例 図3 商品別返品件数表の例 図4 受注金額推移表の例 〔販売管理システムのテーブル構造と処理の設計〕 (1) テーブル構造 設計された販売管理システムのテーブル構造を、図5に示す。 図5 販売管理システムのテーブル構造(一部の列名は省略) (2) テーブルと処理の関係 表1の各業務、及び図2~4に示した各帳票の作成を処理の単位として、主なテーブルに対する行の追加、参照、更新、削除との関係を表3にまとめた。 表3 主なテーブルと処理の関係 〔RDBMSの主な仕様〕 販売管理システムに使用する関係データベース管理システム(RDBMS)の主な仕様は、次のとおりである。 (1) 表領域 ① ディスク上の物理的なデータ格納領域を、表領域という。 ② 表領域には、データディクショナリなどを格納するシステム表領域、ソートなどに使用される一時表領域、ログ表領域、ロールバック表領域、及びユーザが作成するテーブルと索引のデータを格納するユーザ表領域がある。 ③ RDBMSがディスクとの間でデータの入出力を行う単位を、ブロックという。ブロックは、制御情報を格納するヘッダ部、テーブルのデータを格納するデータ部、及び更新によって増加するデータを格納する空き領域部から構成される。ブロックサイズ(1ブロックの長さ(バイト))には、1、024、2、048、4、096、8、192のような1、024の整数倍の値を指定する。表領域ごとにブロックサイズを設定できる。 (2) 排他制御 ① トランザクション内でテーブルに対する行の追加、参照、更新、削除が発生した場合は、当該行が格納されているブロックごとにロックを行い、コミット又はロールバックを発行した時点でロックを解放する。 ② デッドロックの検出機能を備えている。複数のトランザクション間でデッドロックを検出した場合、RDBMSはトランザクションを強制的にロールバックして、SQL文の発行元にエラーコードを返す。 (3) 索引 ① B木方式の索引を使用している。 ② すべての索引は、削除して再作成することができる。 (4) パーティション化 ① テーブルごとに一つ又は複数の列(以下、パーティションキーという)と、列値の範囲を指定し、列値の範囲ごとに異なる表領域に行を格納するパーティション化の機能を備えている。 ② パーティション化されたテーブルには、パーティションを特定するパーティションキーによる索引(以下、グローバル索引という)が作成される。そのほかに、一つ又は複数の列をキーとしてパーティションごとに独立した索引(以下、ローカル索引という)を作成することができる。 ③ テーブルを検索するSQL文のWHERE句に、パーティションキーに対応するグローバル索引とローカル索引の列が指定された場合、RDBMSはグローバル索引によってパーティションを特定し、そのパーティション内をローカル索引によって検索する。グローバル索引の列だけが指定された場合、RDBMSはグローバル索引によってパーティションを特定し、そのパーティション内を全件検索する。また、ローカル索引の列だけが指定された場合、RDBMSはすべてのパーティションについて、そのパーティション内をローカル索引によって検索する。 〔ディスク装置〕 販売管理システムで使用するディスク装置の構成は、表4に示すとおりである。 表4 販売管理システムで使用するディスク装置の構成 〔表領域の設計とデータベースの構築〕 表領域の設計とデータベースの構築を行うために、表5のテーブル別表領域割当と、表6の表領域のディスク装置への割当(案)を作成した。 表5 テーブル別表領域割当 表6 表領域のディスク装置への割当(案) 設問1 〔表領域の設計とデータベースの構築〕について、(1)~(3)に答えよ。 (1) 表5を基に、テーブル用のユーザ表領域の所要量見積りを次の手順で行う。この手順中の【ア】~【エ】に入れる適切な字句を答えよ。 ① 表5から、テーブルに格納するデータの平均行長を得る。 ② 表5から、見積行数を得る。 ③ ブロックサイズから、ヘッダ部と空き領域部の長さを差し引く。 ④ ③の結果を①の結果で割り、【ア】を求める。 ⑤ 【イ】を【ウ】で割り、【エ】を求める。 ⑥ ⑤の結果にブロックサイズを掛けて、表領域の所要量を求める。 (2) (1)の手順に従って、“在庫”テーブルの表領域“在庫TS”の所要量(バイト)を求めよ。ここで、ヘッダ部の長さを96バイトとし、空き領域部には、“(ブロックサイズ-ヘッダ部の長さ)×0.1”を割り当てるものとする。 (3) 表6に示した表領域のディスク装置への割当(案)の評価を行う。データ容量については、ディスクの空き領域を十分確保しているものとする。 (i) 入出力速度向上の観点から、“受注”、“受注明細”、“出荷”、“出荷明細”テーブルをHDD4、HDD5に配置することにした。このとき、これらのテーブル用の表領域を表6のように配置する理由を75字以内で述べよ。 (ii) 索引用の表領域を表6のように信頼性がほかよりも低いHDD2に配置した場合、障害の発生確率は高くなるが、それでも運用上問題が少ないと考えられる理由を30字以内で述べよ。 設問2 販売管理システムの性能について、(1)~(4)に答えよ。 なお、索引は主キーだけに定義されているものとする。 (1) 図3で例示した商品別返品件数表の作成での検索効率を上げるために、一つのテーブルに一つの列を追加する。列を追加するテーブル名と、追加する列名、及び性能向上が見込める理由を60字以内で述べよ。 (2) 図4で例示した受注金額推移表の作成では、一つのSQL文で、顧客別、月別、商品別に受注金額を集計することにした。このために、一つのテーブルに一つの列を追加する。列を追加するテーブル名と、追加する列名、及び追加した列をどのように使用するかを35字以内で述べよ。 (3) 販売管理システムのテスト中に、受注処理のレスポンスが悪化し、“顧客”テーブルへのロック待ちが多発していることが分かった。ロック待ちが多発している理由を45字以内で述べよ。 (4) トランザクションのISOLATIONレベルをREAD COMMITTEDとした場合、デッドロックの発生による処理性能の劣化が懸念される。次の①~③の処理の組合せのうち、デッドロックが起こる可能性のあるものを番号で一つ挙げ、その理由を具体的に40字以内で述べよ。 ① 受注と請求 ② 受注と出荷 ③ 受注と返品 設問3 “請求”テーブルについて、次のパーティション化の案A~Cを検討する。表7は、月締め、入金情報ごとの入金確認、未収金集計表作成の処理について、“請求”テーブルに対する検索内容をまとめたものである。記入済の欄に倣って、【a】~【c】に入れる適切な検索内容を述べよ。 〔パーティション化の案〕 A. 事業所コードをパーティションキーとし、事業所コードごとにパーティションを作成する。請求対象年月をキーとするローカル索引と顧客番号をキーとするローカル索引を作成する。 B. 請求対象年月をパーティションキーとし、請求対象年月ごとにパーティションを作成する。事業所コードをキーとするローカル索引と顧客番号をキーとするローカル索引を作成する。 C. 顧客番号をパーティションキーとし、顧客番号の値の範囲によって50個のパーティションを作成する。事業所コードをキーとするローカル索引と請求対象年月をキーとするローカル索引を作成する。 表7 “請求”テーブルのパーティション化の検討
図1 販売管理業務の流れ。受注から出荷指示、出荷、納品、月締め、請求、入金確認までの業務の流れと、受注取消・返品への分岐を示す図。
図1 販売管理業務の流れ。受注から出荷指示、出荷、納品、月締め、請求、入金確認までの業務の流れと、受注取消・返品への分岐を示す図。
表1 各業務の概要。受注、出荷指示、受注取消、出荷、納品、返品、月締め、請求、入金確認の各業務概要を整理した表。
表1 各業務の概要。受注、出荷指示、受注取消、出荷、納品、返品、月締め、請求、入金確認の各業務概要を整理した表。
表2 主な帳票とその概要。未収金集計表、商品別返品件数表、受注金額推移表の帳票名と概要を示す表。
表2 主な帳票とその概要。未収金集計表、商品別返品件数表、受注金額推移表の帳票名と概要を示す表。
図2 未収金集計表の例。顧客別に未収金額を経過月数別に集計した未収金集計表の出力例。
図2 未収金集計表の例。顧客別に未収金額を経過月数別に集計した未収金集計表の出力例。
図3 商品別返品件数表の例。事業所、期間、順位、商品コード、商品名、メーカ名、返品件数を示す商品別集計表の例。
図3 商品別返品件数表の例。事業所、期間、順位、商品コード、商品名、メーカ名、返品件数を示す商品別集計表の例。
図4 受注金額推移表の例。顧客別に商品分類・商品名ごとの月別受注金額を並べた推移表の例。
図4 受注金額推移表の例。顧客別に商品分類・商品名ごとの月別受注金額を並べた推移表の例。
図5 販売管理システムのテーブル構造(一部の列名は省略)。事業所、顧客、商品、SKU、在庫、受注、出荷、請求、入金などのテーブルと列構成を示す図。
図5 販売管理システムのテーブル構造(一部の列名は省略)。事業所、顧客、商品、SKU、在庫、受注、出荷、請求、入金などのテーブルと列構成を示す図。
表3 主なテーブルと処理の関係。各処理が顧客、商品、SKU、在庫、受注、出荷、請求、入金などのテーブルを追加・参照・更新・削除する関係を示す表。
表3 主なテーブルと処理の関係。各処理が顧客、商品、SKU、在庫、受注、出荷、請求、入金などのテーブルを追加・参照・更新・削除する関係を示す表。
表4 販売管理システムで使用するディスク装置の構成。HDD1~HDD5について、内蔵・外付け、ミラーリング、容量、速度、信頼性、価格を比較した表。
表4 販売管理システムで使用するディスク装置の構成。HDD1~HDD5について、内蔵・外付け、ミラーリング、容量、速度、信頼性、価格を比較した表。
表5 テーブル別表領域割当。各テーブルのユーザ表領域名、平均行長、見積行数、ブロックサイズを示す表。
表5 テーブル別表領域割当。各テーブルのユーザ表領域名、平均行長、見積行数、ブロックサイズを示す表。
表6 表領域のディスク装置への割当(案)。HDD1~HDD5にシステム、ログ、表領域、テーブル用表領域、索引用表領域を割り当てる案を示す表。
表6 表領域のディスク装置への割当(案)。HDD1~HDD5にシステム、ログ、表領域、テーブル用表領域、索引用表領域を割り当てる案を示す表。
表7 “請求”テーブルのパーティション化の検討。パーティション化案A~Cについて、月締め、入金確認、未収金集計表作成時の検索方法を比較する表。
表7 “請求”テーブルのパーティション化の検討。パーティション化案A~Cについて、月締め、入金確認、未収金集計表作成時の検索方法を比較する表。
解き方のヒントを見る

性能改善を考えるための観察軸

物理設計や性能改善を検討するときは、まず処理のどこに負荷が現れているかを観測し、変更の目的と影響範囲を対応づけます。単一の手段に決めつけず、利用状況や運用上の制約も含めて比較してください。

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

焦点は、見えている遅さを印象だけで判断せず、対象となる処理、発生条件、観測結果、変更後に確かめる指標を一つの流れで整理できるかです。改善の前後を同じ条件で見比べる視点を持ちましょう。

視点

性能は構造だけでなく、処理内容、データ量、利用頻度、同時実行、更新や保守の条件などの組合せで変わります。候補を考える際は、観測事実と仮説を分け、期待する効果と副作用を同じ基準で整理します。

確認ポイント

  • 遅さを感じた処理と、その発生条件を同じ対象として整理できているか
  • 変更の狙いと、影響を受ける範囲を分けて書けているか
  • 変更前後を比較するための観測方法と判断基準を決めているか
正解と解説を見る

解説

販売管理システムの業務要件とRDBMS仕様を読み取り、表領域の容量見積り、ディスク配置、索引追加、ロック競合、デッドロック、パーティション検索を一貫して考える問題です。

問題の全体像

A社の販売管理システムを題材に、受注から入金確認までの業務と、テーブル構造・表領域・ディスク装置・索引・パーティション化を関連付けて問う。設問1は容量見積りと信頼性・入出力を考慮した配置、設問2は検索性能とブロック単位のロック、設問3は業務ごとの検索条件に適したパーティション設計が中心です。公式解答例と採点講評からは、単に用語を答えるのではなく、問題文の業務ルールとRDBMS仕様を具体的な処理へ落とし込むことが重視されている。

設問1(ア)

③では、ブロックサイズからヘッダ部と空き領域部を除いた、1ブロックに実際にデータを格納できる長さが得られる。これを平均行長で割るため、求めるのは1ブロックに格納できる行数の上限です。公式解答例では「1ブロック内の最大行数」としている。

設問1(イ)

⑤では、必要な行数を1ブロック当たりの最大行数で割って、必要ブロック数を求める流れになる。したがって【イ】は、②で表5から得た「見積行数」です。

設問1(ウ)

⑤の割る数は、④で求めた1ブロック内の最大行数です。したがって【ウ】は「④の結果」となる。平均行長そのものではなく、ブロック当たりに格納できる行数を使う点に注意する。

設問1(エ)

見積行数を1ブロック内の最大行数で割ると、表全体に必要なブロック数が得られる。⑤の結果にブロックサイズを掛けて表領域の容量を出すため、【エ】は「必要ブロック数」です。

設問1(2)

在庫TSは平均行長190バイト、見積行数900、000、ブロックサイズ4、096バイトです。空き領域は(4、096−96)×0.1=400バイト、データ部は3、600バイトとなる。1ブロックの最大行数は3、600÷190の整数部分で18行、必要ブロック数は900、000÷18=50、000ブロックです。よって所要量は50、000×4、096=204、800、000バイトとなる。

設問1(3)(i)

出荷指示などでは、受注・受注明細・出荷・出荷明細の複数テーブルを同時に参照・更新する。これらをHDD4とHDD5へ分散すれば、同時処理で同じディスクに入出力が集中することを避けられる。公式解答例では、この入出力競合の回避を75字以内で説明している。

設問1(3)(ii)

HDD2は信頼性が低いが、そこに置くのは索引用の表領域です。問題文ではすべての索引を削除して再作成できるため、索引が障害で失われても再作成によって復旧できる。公式解答例の要点は「索引は再作成によって復旧できるから」です。

設問2(1)

商品別返品件数表は事業所別に作成するが、出荷表には事業所コードがない。公式解答例では「出荷」テーブルに「事業所コード」を追加する。受注担当社員番号と受注年月日から所属表を参照して受注時点の事業所コードを求める処理を、出荷時に保持した列で省略できるため、検索効率が上がると説明する。答案はテーブル名・列名・参照処理の削減を60字以内に収める。

設問2(2)

受注金額推移表は顧客別・月別・商品別の集計を一つのSQL文で行う。公式解答例では「受注」テーブルに「受注年月」を追加し、顧客番号・受注年月・商品コードでグループ化する。月を受注年月から直接扱えるようにし、集計条件を一つのSQL文にまとめる点を書く。

設問2(3)

受注処理では顧客テーブルを更新する一方、RDBMSは行そのものではなく、その行を含むブロックをロックする。顧客テーブルは1ブロック内の行数が多いため、ある顧客の更新でも同じブロック内の多くの行がロック対象となり、他の受注処理の待ちが増える。公式解答例の「1ブロック内の行数が多く、更新の都度ロックされる対象行が多くなる」という要点を押さえる。

設問2(4)

該当するのは③の受注と返品です。両処理は在庫テーブルの複数行を更新する可能性があり、処理ごとに異なる順序で行を更新すると、一方が保持するロックを他方が待ち、相互待ちになる。単に同じテーブルを使うだけでなく、複数行を異なる順序で更新することがデッドロックの具体的原因です。

設問3(a)

案Aは事業所コードでパーティションを分けている。月締めは事業所ごとに行い、対象月中に納品済みの請求を処理するため、当該事業所の一つのパーティションを特定できる。そのパーティション内で請求対象年月のローカル索引を使って検索する、と述べる。

設問3(b)

案Bは請求対象年月でパーティションを分けている。未収金集計表は全事業所の過去1年以内の請求を顧客ごとに集計するため、過去1年以内の対象年月のパーティションを絞り込めるが、各パーティション内で事業所コードや顧客番号による絞込みは不要です。公式解答例では、その範囲を全件検索するとしている。

設問3(c)

案Cは顧客番号の値の範囲でパーティションを分けている。入金確認では振込人欄の顧客番号が分かるため、当該顧客番号を含む一つのパーティションを特定できる。その後、事業所コードのローカル索引で対象事業所の請求を検索する、という順序を説明する。

学習のポイント

業務処理の更新対象とRDBMSの物理・排他・索引仕様を結び付けて説明する力を養う。

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

関連する過去問一覧

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