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

















解き方のヒントを見る
性能見積りの前提を整理する
物理設計の性能を考えるときは、結論を急がないことが大切です。まず、問題文に示された前提条件と、対象の処理が何を求めているかを整理しましょう。確認する観点は一つに絞り、落ち着いて見直してください。
この問題で問われていること
この問題で確認すべき観点は一つです。問われている処理について、問題文中の条件・件数・前提として与えられた値のうち、どれが判断の根拠になるかを自分で対応付けられているかを確かめてください。
視点
性能に関する判断は、設計そのものだけでは決まりません。その設計に対して、どのような処理がどのような条件で行われるかという前提にも左右されます。前提を取り違えると、知識が正しくても結論がずれてしまいます。まず、与えられた前提と問われている内容の対応を確認する姿勢が役立ちます。
確認ポイント
- 問われている処理が何を対象としているかを、問題文の記述に戻って確認したか
- 判断に用いる条件や数値が、問題文のどこに示された前提に基づくかを特定したか
- 自分の結論が、与えられた前提以外の思い込みに依存していないかを見直したか
正解と解説を見る
解説
R県の地域医療情報システムを題材にした物理設計の問題です。問われているのは、処理1の結合を減らす列の追加、患者基本のデータ所要量の計算、患者詳細のテーブル定義と参照制約、オーダのサブタイプ実装方法による結合・和集合の違いと検査制約、処理5の集計差異、処理6の集合演算、参照テーブルの整理、索引と物理分割による探索ページ数の見積りです。出題趣旨では、論理データモデルを物理データベースに設計する能力、ディスク容量を算出する能力、性能を考えたデータ配置の設計、データ操作の設計、アクセス性能の見積りを評価するとしています。
問題の全体像
医療機関から集めた診療データ(10年分、年間9、000万件のオーダ)を蓄積するシステムについて、論理設計を終えたM社が物理設計を進める事例です。前半は、テーブル構造の検討(処理1の結合削減、オーダのスーパタイプ・サブタイプの実装案A~C)と、テーブル定義表の作成です。後半は、処理5・6の問合せ分析と、索引案X~Z・物理分割案①②による探索対象ページ数の試算です。採点講評では、設問1(3)で電話番号のNULLフラグを考慮しない解答、設問1(4)処理3の誤り、設問2(2)で積集合が欠けた解答、設問3(2)(3)の物理分割の理解不足が指摘されています。
設問1(1)
処理1は、入院した患者の延べ人数を性別と入院時の保険機関ID別に集計し、現在の保険機関名を出力する処理です。関係スキーマのままでは、患者入退院に加えて、患者基本(性別)、患者詳細(入院日時点で有効な保険機関ID)、保険機関(保険機関名)との結合が必要です。表1では「患者の入院中に保険機関が変わることはない」とされているため、入院時の保険機関IDを患者入退院の行に持たせても結果は変わりません。性別も患者入退院に持たせれば、患者基本と患者詳細との結合が不要になります。一方、保険機関名は変わることがあり、現在の名称を出力する必要があるため、保険機関との結合は残します。公式解答例では、追加先は患者入退院テーブル、追加列は保険機関IDと性別(順不同)です。
設問1(2)(a)
表5の格納長を合計します。患者ID 8、氏名 24、性別 1、生年月日 4、職業 23で、合計60バイトです。氏名は平均の文字数が不明なので、最大20字の半分の10字×2+制御情報4=24です。職業は平均9字×2+制御情報4+NULLフラグ1=23です。公式解答例では、aは60です。
設問1(2)(b)
ページサイズは4、000バイトで、空き領域率が10%なので、行を格納できるのは3、600バイトです。3、600÷60=60なので、1ページの平均行数は60行です。公式解答例でも、bは60です。
設問1(2)(c)
患者基本は患者1人につき1行です。データ更新処理の記述では、名寄せ後の患者数は300万人で大きな増減はないとされています。したがって、見積行数は3、000、000行です(公式解答例と同じ)。
設問1(2)(d)
3、000、000行÷60行/ページ=50、000ページです。同じページに異なるテーブルの行は格納されないため、患者基本だけで計算します。公式解答例では、dは50、000です。
設問1(2)(e)
50、000ページ×4、000バイト=200、000、000バイトなので、200百万バイトになります。公式解答例では、eは200です。
設問1(3)
表1、表3、テーブル定義の方針を当てはめます。公式解答例では次のとおりです。有効開始日はDATE・NOT NULL=Y・4バイトで、主キーの2番目の構成列(P列に2)です。住所はNCHAR VARYING(300)・Y・64バイト(平均30字×2+4)です。電話番号はVARCHAR(20)・N・15バイト(平均が不明なので20字の半分の10+制御情報4+NULLフラグ1)です。医療圏コードはCHAR(3)・Y・3バイトで、NU索引の構成列1です。保険機関IDはCHAR(8)・N・9バイト(8+NULLフラグ1)で、もう一つのNU索引の構成列1です。登録が任意の電話番号と保険機関IDはNOT NULL制約を付けられないため、NULLフラグの1バイトを加えます。採点講評でも、電話番号のフラグの考慮漏れが指摘されています。医療圏コードと保険機関IDは、医療圏・保険機関と結合する外部キーの列なので、方針(6)に従って非ユニーク索引を作成します。
設問1(3)(ア)
図2の患者詳細の外部キー(破線下線)は3つです。患者ID(患者基本への参照)、医療圏コード(医療圏への参照)、保険機関ID(保険機関への参照)です。したがって、参照制約を定義する対象は、公式解答例のとおり患者基本、医療圏、保険機関の3テーブルです。
設問1(4)
処理3は、全ての処方・検査の医療コスト(スーパタイプの属性)を医療機関別に集計する処理です。案Aは1テーブルなので「-」です。案Bはスーパタイプのオーダテーブルに医療コストがあるので、処方・検査と結合する必要がなく「-」です。案Cは処方テーブルと検査テーブルに分かれているので、両方の行を集めるための「和集合」が必要です。処理4は、オーダ発行日(スーパタイプ)と検査項目数(サブタイプ)を出力する処理です。案Aは「-」です。案Bはオーダと検査の「内結合」が必要です。案Cは検査テーブルにスーパタイプの属性も含まれるので「-」です。公式解答例は、処理3が-/-/和集合、処理4が-/内結合/-です。採点講評によると、処理3の正答率は低かったとのことです。
設問1(4)(イ)
表1では、処方の用法と検査の検査項目数はどちらも登録時に必須です。しかし、案Aでは処方と検査を1つのテーブルにまとめるため、用法列と検査項目数列にNOT NULL制約を付けられません(相手のサブタイプの行ではNULLになるため)。そこで、オーダ種別が処方の行では用法が、検査の行では検査項目数が、それぞれ必ず入っていることを検査制約で保証する必要があります。公式解答例では、イは「NULLでないこと」です。
設問1(4)(ウ)
ウは、そのオーダ種別には存在しないサブタイプの属性に当てはまる条件です。案Aの1つのテーブルには処方の用法列と検査の検査項目数列が両方あります。しかし、処方のオーダには検査項目数という属性がなく、検査のオーダには用法という属性がありません。したがって、①オーダ種別が処方の行では検査項目数が、②オーダ種別が検査の行では用法が、どちらもNULLでなければなりません。これらに値が入ると、処方なのに検査項目数を持つ、検査なのに用法を持つといった、サブタイプの区別と矛盾したデータになります。公式解答例では、ウは「NULLであること」です。案BやCでは各サブタイプが別テーブルになっており、そもそも相手の列を持たないため、この制約は案Aに特有のものです。
設問2(1)
表8は、オーダの医療機関が属する医療圏(医療機関テーブルの現在の医療圏コード)で集計します。表9は、オーダ発行日時点の患者の住所に基づく医療圏(患者詳細)で集計します。この2つの医療圏がずれる場面を具体的に書きます。公式解答例では次の3つが示されています。①患者が、住所で決まる医療圏とは異なる医療圏にある医療機関で診療を受けた場合(表1に、そのような場合もあると明記されています)。②指定期間内に患者が異なる医療圏に転居した場合。③指定期間内に医療機関が異なる医療圏に移設された場合。採点講評では、データの状態だけを書いて業務上の具体的な事象を書いていない解答が指摘されています。「〇〇が△△した場合」という事象を、45字以内で1つ書くのが目安です。
設問2(2)
表10~12の問合せは、(a)で選ばれたオーダの行ごとに、(c)の条件を個別に抽出したものです。R1(表10)は、病名コードが'G210'で、診断日が(a)の行のオーダ発行日から60日後までの間にある患者病名を持つ患者IDの集合です。R2(表11)は、検査項目コードが'3B010'かつ結果値が1、000以上の検査内訳のうち、検査実施日が(a)の行のオーダ発行日から60日後までの間にあるものを持つ患者IDの集合です。R3(表12)は、同じ条件の検査内訳のうち、検査実施日がオーダ発行日の21日前から前日までの間にあるものを持つ患者IDの集合です。処理6の(c)は、「G210の病名がある(R1)」か、「発行日以降60日以内に該当検査がある(R2)が、発行日前21日間に該当検査がない(R3に含まれない)」かのいずれかです。したがって、公式解答例のとおりR1 ∪ (R2 ∩ ¬R3)となります。採点講評では、R2と¬R3の積(∩)が抜けた不完全な解答が指摘されています。「ただし~ない」という条件は、補集合との積集合として表す点に注意してください。
設問2(3)
案Aの採用が前提なので、処方・検査の属性はオーダテーブルにあります。処理2は、性別・生年月日(年齢)で患者基本を、オーダ発行日と用法でオーダを参照します。処理3は、氏名で患者基本を、医療機関名で医療機関を、医療コストでオーダを参照します。処理4は、医療圏名から医療圏コードを得るために医療圏を、性別・年齢で患者基本を、住所に基づく医療圏コードで患者詳細を、オーダ発行日・検査項目数でオーダを参照します。公式解答例もこのとおりで、処理2は患者基本・オーダ、処理3は医療機関・患者基本・オーダ、処理4は医療圏・患者基本・患者詳細・オーダに○が付いています。
設問3(1)
探索対象行数の18、000、000は、10、000人×10年間1、800件です。患者IDの索引ではオーダ発行日による絞込みができないため、患者の全オーダが探索対象になります。案Yはクラスタ索引なので、前提③により同じ患者IDの1、800行が36ページにまとまっています。よって10、000人×36ページ=360、000ページです。案Zは非クラスタ索引で行の並びがランダムなため、1行ごとに別のページにアクセスすると考え、テーブルのバッファヒット率0%と合わせて18、000、000ページになります。公式解答例では、案Yが360、000、案Zが18、000、000です。
設問3(2)
案②は、患者IDの範囲で120区分に分けています。絞り込まれた10、000人の患者IDは各区分に一様に分布するため、探索対象区分数は120です。区分が20を超えるので、並行実行数は上限の20になります。各区分では、区分キー(患者ID)の非クラスタの区分内索引で対象患者の行を探しますが、オーダ発行日では絞り込めません。そのため、探索対象行数は10、000人×1、800件=18、000、000行です。非クラスタなので、探索対象ページ数も18、000、000になります。公式解答例では、120、20、18、000、000、18、000、000です。
設問3(3)
案Yでは、テーブル全体が患者ID順に並んでいるので、患者ごとに10年分の連続した36ページを読みます。案①に患者IDのクラスタ区分内索引を加えた場合、行はまず年月の区分に分かれ、その区分の中で患者ID順に並びます。そのため、対象となる12か月の区分それぞれで、その患者の行が並ぶ連続ページだけを読めばよく、対象外の年月のページは読みません。公式解答例の要旨は、「案Yでは患者IDごとに連続するページにアクセスするが、案①ではオーダ発行日の年月ごと・患者IDごとに連続するページにアクセスするから」です。80字以内で、両案のページ配置の単位(患者ID単位か、年月区分×患者ID単位か)の違いを対比して書くのがポイントです。採点講評でも、物理分割された区分内でのデータの格納とアクセスの理解が求められています。
学習のポイント
特に次の3点を押さえてください。①NULLフラグや可変長の制御情報を含む格納長の計算。②サブタイプ実装方式ごとのSQL演算の違い。③クラスタ索引・非クラスタ索引・物理分割でのページアクセス数の計算。
出典:独立行政法人 情報処理推進機構(IPA)平成27年度春期 データベーススペシャリスト試験 午後Ⅱ 問1(公式資料:問題冊子(PDF) / 解答例 / 採点講評)
関連する過去問一覧
IPA Advancedは非公式の学習サイトです。解説にはAIによる補助生成を含む場合があります。公式の問題冊子・解答例・採点講評を優先し、誤りは確認後に訂正します。運営・編集方針