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

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

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

問題

問1 データベースの物理設計に関する次の記述を読んで、設問1~3に答えよ。 R県では、県内の病院、診療所などの医療機関から診療データを収集し、標準化して蓄積し、医療機関間の情報連携、薬品の有効性などの調査、統計資料の作成などに利用する地域医療情報システムを構築することになった。システム開発を担当するM社では、現在、データベースの論理設計を終え、物理設計に着手したところである。 〔データベースの論理設計〕 地域医療情報システムの概念データモデルを図1に、主な属性の意味と制約を表1に、関係スキーマを図2に示す。 図1 地域医療情報システムの概念データモデル 表1 地域医療情報システムの主な属性の意味と制約 図2 地域医療情報システムの関係スキーマ(一部省略) 〔地域医療情報システムの処理〕 地域医療情報システムでは、次の処理が行われる。 1. データ更新処理 医療機関から診療データファイルを受信する。診療データは、患者の名寄せ、コード値の標準化などの必要な処理を行った上で、バッチ処理で地域医療情報システムのデータベースに格納される。格納される主なデータの特徴は、次のとおりである。 (1) 県内の医療機関数は200で、医療機関によって患者数、オーダの数にはばらつきがある。 (2) 名寄せ後の患者数は300万人で、大きな増減はないと見込んでいる。 (3) 10年前のオーダ発行日から現在までの全オーダを保存する。オーダの数は、毎月ほぼ一定で、年間9、000万件に達する。 2. データ分析処理 地域医療情報システムで実行されるデータ分析処理を、表2に示す。 表2 データ分析処理 〔RDBMSの仕様〕 1. 表領域 (1) テーブル、索引のストレージ上の物理的な格納場所を、表領域という。 (2) RDBMSがストレージとデータの入出力を行う単位を、データページという。 データページには、テーブル、索引のデータが格納される。表領域ごとに、ページサイズ(1データページの長さで、2、000、4、000、8、000、16、000バイトのいずれか)と、空き領域率(将来の更新に備えて、データページ内に確保しておく空き領域の割合)を指定する。 (3) 同じデータページに、異なるテーブルの行が格納されることはない。 2. テーブル (1) テーブルの列には、NOT NULL制約を指定することができる。NOT NULL制約を指定しない列には、NULLかどうかを表す1バイトのフラグが付加される。 (2) 主キー制約には、主キーを構成する列名を指定する。 (3) 参照制約には、列名、参照先テーブル名、参照先列名を指定する。制約に違反する行の追加と削除、列値の更新は拒否される。 (4) 検査制約には、同じ行の列に対する制約と、副問合せによる他のテーブルに対する制約を記述することができる。 (5) 使用可能なデータ型は、表3のとおりである。 表3 使用可能なデータ型 3. 索引 (1) 索引には、ユニーク索引と非ユニーク索引がある。 (2) 索引には、クラスタ索引と非クラスタ索引がある。クラスタ索引は、キー値の順番とキー値が指す行の物理的な並び順が一致し、非クラスタ索引はランダムである。 4. アクセスパス アクセスパスは、統計情報を基に、RDBMSによって表探索又は索引探索に決められる。表探索では、索引を使用せずに全データページを順次に探索する。一方、索引探索では、検索条件に適した索引によって対象行を絞り込んだ上で、データページを探索する。 5. テーブルの物理分割 (1) テーブルごとに一つ又は複数の列を区分キーとし、区分キー値の範囲ごとに物理的な格納領域を分ける。これを物理分割という。 (2) 物理分割されたテーブルには、区分キー値の範囲ごとに分割された索引(以下、区分内索引という)を定義することができる。 (3) テーブルを検索するSQL文のWHERE句の述語に、区分キー列を指定すると、RDBMSは区分キー値で区分を特定する。さらに、区分内索引が使用できる場合は、区分内索引によって区分内を探索する。 (4) RDBMSは、問合せの実行時に、一つのテーブルの複数の区分を探索する場合、最大で20区分の探索を同時に並行して実行し、探索結果をまとめて返却する。探索対象の区分数が20を超える場合、20区分を同時に並行して探索し、一つの区分の探索が終了するごとに、次の区分を探索する。 〔データベースの物理設計〕 データベースの物理設計に着手したM社の設計担当者は、テーブルと索引の設計と定義について検討した。 1. テーブル構造の検討 (1) 表2の処理1では、テーブルの結合処理に時間が掛かるおそれがあるという懸念から、改善方法を検討することにした。 (2) 関係“オーダ”の実装について次の案A~Cを検討した結果、案Aを採用することにした。関係“オーダ”、“処方”、“検査”以外のテーブルは、関係スキーマどおりとする。 案A スーパタイプと全てのサブタイプを、一つのテーブルにする。 案B スーパタイプとサブタイプを、それぞれテーブルにする。 案C サブタイプだけを、それぞれテーブルにする。スーパタイプの属性は列として各テーブルに保有する。 検討に当たって、表2の処理2~4を、それぞれ一つのSQL文で実行する問合せにおいて、関係“オーダ”、“処方”、“検査”に対応するテーブル間で行われる内結合、和集合の演算を、表4にまとめた。 表4 テーブル間で行われる内結合、和集合の演算(未完成) 注記 “内結合”、“和集合”、“内結合及び和集合”のいずれか、又はそれ以外の場合に、“-”を記入する。 2. テーブル定義表の作成 次の方針に基づいて、テーブル定義を行う。作成中のテーブル定義表の一部を表5~7に示す。 (1) 関係名をテーブル名に、属性名を列名に読み替える。 (2) データ型欄には、次の規則に従って、格納領域の長さが最小になるようにデータ型を選択して記入し、適切な長さ、精度、位取りも併せて記入する。 ① 整数は、SMALLINT、INTEGERを優先する。 ② 日付は、専用のデータ型を選択する。 (3) NOT NULL欄には、NOT NULL制約があればYを、なければNを記入する。 (4) 格納長欄には、RDBMSの仕様に従って、格納するデータ長の見積りを記入する。可変長文字列は、列値の平均的な長さが分かる場合は、その長さを基準にし、分からない場合は、最大長の半分(小数点以下は切上げ)を基準にする。 (5) 索引の種類と構成列欄は、縦列が一つの索引を表す。索引の種類には、P(主キーの索引)、U(ユニーク索引)、NU(非ユニーク索引)のいずれかを記入する。索引の種類の下部の構成列には、索引を構成する列の定義の順を、1からの連番で記入する。 (6) 主キーの索引は必ず作成する。主キー以外の索引は、一つ以上の列が検索又は結合の条件に使用される場合に必ず作成する。 (7) 制約欄には、参照制約、検査制約をSQLの構文で記入する。参照制約の参照動作(NO ACTION、CASCADE、SET NULLなど)は、記入しない。 表5 “患者基本”テーブル定義表 表6 “患者詳細”テーブル定義表(作成中) 表7 “オーダ”テーブル定義表 注記 案Aの採用を前提としている。網掛け部分は、表示していない。 〔問合せの検討〕 1. 表2の処理5の問合せ検討 表8と表9の2通りの問合せについて、実行結果を比較することにした。 表8 処理5の問合せ(1) 表9 処理5の問合せ(2) 2. 表2の処理6の問合せ検討 処理6の問合せについて、(a)で選択される“オーダ”テーブルの行ごとに、(b)は考慮せず、(c)で必要になる問合せを個別に抽出して、表10~12にまとめた。 表10 処理6の問合せ(1) 表11 処理6の問合せ(2) 表12 処理6の問合せ(3) 3. 問合せの傾向分析 表2の処理1~6の参照テーブルを表13にまとめ、問合せで参照されるテーブルを分析した。 表13 処理1~6の参照テーブル(作成中) 注記 ○:テーブルが処理で参照されることを表す。 処理5の(1)と(2)は、それぞれ表8と表9の問合せに対応している。 〔性能の見積りと物理分割の検討〕 データ分析処理では、大量のデータページにアクセスが発生し、ディスクへのI/Oがボトルネックとなることが予想される。そこで、M社では、探索対象ページ数を試算して性能の見積りを行った上で、性能改善のための対策を検討することにした。 1. 探索対象ページ数試算の前提 (1) 試算に用いる問合せ ① “オーダ”テーブルへのアクセスにおける探索対象ページ数を試算する。 ② 性別、年齢別などの条件で絞り込まれた10、000人の患者について、オーダ発行日が、指定された年月から1年以内のオーダを抽出する。 (2) 試算に用いる前提条件と基礎数値 ① “オーダ”テーブルの1ページの平均行数は、50行とする。 ② 患者ごとのオーダの数は、10年間1、800件で、各年月に均一に分布しているものとする。 ③ クラスタ索引の定義されたテーブルの行は、索引の列値ごとに異なるデータページに格納されるものとする。したがって、例えば、索引の列値が等しい1、800行のデータは、36ページに格納される。 ④ バッファヒット率は、索引のデータページでは100%、テーブルのデータページでは0%とする。 2. 探索対象ページ数の試算 次の案X~Zのいずれか一つの索引を定義することを想定して、「1. 探索対象ページ数試算の前提」に基づいて探索対象ページ数を試算し、表14にまとめた。 案X 医療機関IDをキーとするクラスタ索引 案Y 患者IDをキーとするクラスタ索引 案Z 患者IDをキーとする非クラスタ索引 表14 索引による探索対象ページ数試算値(作成中) 3. 物理分割の検討 “オーダ”テーブルについて、物理分割による処理性能の向上について検討することにした。物理分割の次の案①、②について、「1. 探索対象ページ数試算の前提」に基づいて、探索対象ページ数を試算し、表15にまとめた。試算に当たって、区分キーには、非クラスタの区分内索引が作成され、それ以外の区分内索引はないものとする。また、区分キーの値は、各区分に一様に分布するものと仮定する。 案① オーダ発行日を区分キーとし、その年月によって120に区分する。 案② 患者IDを区分キーとし、その値の範囲によって最大120に区分する。 表15 物理分割案の探索対象ページ数試算値(作成中) 設問1 〔データベースの物理設計〕について、(1)~(4)に答えよ。 (1) テーブル構造の検討において、表2中の処理1で、処理の実行結果を変えずに、結合対象テーブル数を最小にするために、一つのテーブルに二つの列を追加する。列の追加対象となるテーブル名と追加する列名を答えよ。 (2) “患者基本”テーブルのデータ所要量(百万バイト)を求める次の記述中の【a】~【e】に入れる適切な数値を答えよ。ここで、表領域のデータページのページサイズを4、000バイト、空き領域率を10%とする。 “患者基本”テーブルの平均行長は【a】バイト、1ページの平均行数は【b】行、見積行数は【c】行である。したがって、必要ページ数は【d】ページ、データ所要量は【e】百万バイトとなる。 (3) 表6中の太枠内に適切な字句を記入して、太枠内を完成させよ。また、【ア】に入れる参照制約について、参照制約定義の対象とすべきテーブル名を全て答えよ。 (4) 関係“オーダ”の実装について、表4中の太枠内に適切な字句又は“-”を記入し、表を完成させよ。また、案Aでは、表7に記入済みの制約に加えて、他の案にはない次の検査制約が必要になる。【イ】、【ウ】に入れる適切な字句を答えよ。 検査制約:オーダ種別が処方の場合は、用法が【イ】及び検査項目数が【ウ】、並びに、オーダ種別が検査の場合は、用法が【ウ】及び検査項目数が【イ】 設問2 〔問合せの検討〕について、(1)~(3)に答えよ。 (1) 表8と表9の問合せの実行結果を比較したところ、複数の医療圏で医療コストの集計値が異なることがあった。どのような場合に集計値の相違が発生するか。具体的に45字以内で述べよ。 (2) 表2中の処理6の問合せについて、(c)に該当する患者IDの集合を得るための集合演算を答えよ。ここで、表10~12の問合せ結果の集合をそれぞれR1~R3とし、集合演算は、次の凡例に従うものとする。 凡例 A∩B:AとBの積集合 A∪B:AとBの和集合 ¬A:Aの補集合 A∩(B∪C):演算の順位は括弧を用いて表す。 (3) 表13中の太枠内に“○”を記入し、表を完成させよ。 設問3 〔性能の見積りと物理分割の検討〕について、(1)~(3)に答えよ。 (1) 表14中の太枠内に適切な数値を入れて表を完成させよ。 (2) 表15中の太枠内に適切な数値を入れて表を完成させよ。 (3) 物理分割の案①について、区分内索引として、患者IDをキーとするクラスタ索引を使用した場合の探索対象ページ数を試算した。その結果、索引の定義は案Yと同じであるが、試算値が表14と異なっていた。試算値が異なる理由を、80字以内で具体的に述べよ。
図1 地域医療情報システムの概念データモデル。病名、患者、医療機関、オーダ、処方、検査などのエンティティと、それらの関連を示す概念データモデル。
図1 地域医療情報システムの概念データモデル。病名、患者、医療機関、オーダ、処方、検査などのエンティティと、それらの関連を示す概念データモデル。
表1 地域医療情報システムの主な属性の意味と制約。患者、医療機関、オーダなどの属性名と、その意味、データ形式、必須性などの制約を一覧化した表。
表1 地域医療情報システムの主な属性の意味と制約。患者、医療機関、オーダなどの属性名と、その意味、データ形式、必須性などの制約を一覧化した表。
図2 地域医療情報システムの関係スキーマ(一部省略)。病名分類から患者、オーダ、処方、検査内訳までの関係スキーマを、主キーや参照関係とともに示した図。
図2 地域医療情報システムの関係スキーマ(一部省略)。病名分類から患者、オーダ、処方、検査内訳までの関係スキーマを、主キーや参照関係とともに示した図。
表2 データ分析処理。入院患者集計、処方検索、医療コスト集計、検査検索など、六つのデータ分析処理の内容を示す表。
表2 データ分析処理。入院患者集計、処方検索、医療コスト集計、検査検索など、六つのデータ分析処理の内容を示す表。
表3 使用可能なデータ型。CHAR、NCHAR、VARCHAR、整数型、DECIMAL、DATEなどのデータ型と格納方法を説明する表。
表3 使用可能なデータ型。CHAR、NCHAR、VARCHAR、整数型、DECIMAL、DATEなどのデータ型と格納方法を説明する表。
表4 テーブル間で行われる内結合、和集合の演算(未完成)。オーダ、処方、検査の実装案ごとに、処理2~4で必要となる内結合や和集合を記入する未完成表。
表4 テーブル間で行われる内結合、和集合の演算(未完成)。オーダ、処方、検査の実装案ごとに、処理2~4で必要となる内結合や和集合を記入する未完成表。
表5 “患者基本”テーブル定義表。患者基本テーブルの列、データ型、NULL可否、格納長、主キー索引などを示す定義表。
表5 “患者基本”テーブル定義表。患者基本テーブルの列、データ型、NULL可否、格納長、主キー索引などを示す定義表。
表6 “患者詳細”テーブル定義表(作成中)。患者詳細テーブルの各列について、未完成のデータ型、NULL可否、格納長、索引欄を示す表。
表6 “患者詳細”テーブル定義表(作成中)。患者詳細テーブルの各列について、未完成のデータ型、NULL可否、格納長、索引欄を示す表。
表7 “オーダ”テーブル定義表。オーダテーブルの列定義、索引、検査制約、医療機関などへの外部キー制約を示す表。
表7 “オーダ”テーブル定義表。オーダテーブルの列定義、索引、検査制約、医療機関などへの外部キー制約を示す表。
表8 処理5の問合せ(1)。オーダと医療機関を対象に、期間条件と医療機関ID一致で医療コストを集計する問合せの手順表。
表8 処理5の問合せ(1)。オーダと医療機関を対象に、期間条件と医療機関ID一致で医療コストを集計する問合せの手順表。
表9 処理5の問合せ(2)。オーダと患者詳細を対象に、患者IDと有効開始日を条件として医療圏を求める問合せの手順表。
表9 処理5の問合せ(2)。オーダと患者詳細を対象に、患者IDと有効開始日を条件として医療圏を求める問合せの手順表。
表10 処理6の問合せ(1)。患者病名から病名コードG210と診断日の期間条件で患者IDを抽出する問合せの整理表。
表10 処理6の問合せ(1)。患者病名から病名コードG210と診断日の期間条件で患者IDを抽出する問合せの整理表。
表11 処理6の問合せ(2)。検査内訳とオーダを結合し、検査項目コードと結果値、検査実施日の条件で患者IDを得る問合せ表。
表11 処理6の問合せ(2)。検査内訳とオーダを結合し、検査項目コードと結果値、検査実施日の条件で患者IDを得る問合せ表。
表12 処理6の問合せ(3)。検査内訳とオーダを結合し、薬品処方前の期間に該当する検査の有無を調べる問合せ表。
表12 処理6の問合せ(3)。検査内訳とオーダを結合し、薬品処方前の期間に該当する検査の有無を調べる問合せ表。
表13 処理1~6の参照テーブル(作成中)。処理1~6ごとに、医療圏、医療機関、患者、オーダなど参照されるテーブルを整理する未完成表。
表13 処理1~6の参照テーブル(作成中)。処理1~6ごとに、医療圏、医療機関、患者、オーダなど参照されるテーブルを整理する未完成表。
表14 索引による探索対象ページ数試算値(作成中)。医療機関ID、患者IDのクラスタ索引と非クラスタ索引について、探索対象行数とページ数を比較する表。
表14 索引による探索対象ページ数試算値(作成中)。医療機関ID、患者IDのクラスタ索引と非クラスタ索引について、探索対象行数とページ数を比較する表。
表15 物理分割案の探索対象ページ数試算値(作成中)。オーダ発行日または患者IDで120区分する二つの物理分割案について、探索区分数やページ数を示す表。
表15 物理分割案の探索対象ページ数試算値(作成中)。オーダ発行日または患者IDで120区分する二つの物理分割案について、探索区分数やページ数を示す表。
解き方のヒントを見る

性能見積りの前提を整理する

物理設計の性能を考えるときは、結論を急がないことが大切です。まず、問題文に示された前提条件と、対象の処理が何を求めているかを整理しましょう。確認する観点は一つに絞り、落ち着いて見直してください。

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

この問題で確認すべき観点は一つです。問われている処理について、問題文中の条件・件数・前提として与えられた値のうち、どれが判断の根拠になるかを自分で対応付けられているかを確かめてください。

視点

性能に関する判断は、設計そのものだけでは決まりません。その設計に対して、どのような処理がどのような条件で行われるかという前提にも左右されます。前提を取り違えると、知識が正しくても結論がずれてしまいます。まず、与えられた前提と問われている内容の対応を確認する姿勢が役立ちます。

確認ポイント

  • 問われている処理が何を対象としているかを、問題文の記述に戻って確認したか
  • 判断に用いる条件や数値が、問題文のどこに示された前提に基づくかを特定したか
  • 自分の結論が、与えられた前提以外の思い込みに依存していないかを見直したか
正解と解説を見る

解説

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による補助生成を含む場合があります。公式の問題冊子・解答例・採点講評を優先し、誤りは確認後に訂正します。運営・編集方針