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

令和3年度秋期 データベーススペシャリスト 午後Ⅰ 問2

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

問題

問2 データベースの実装に関する次の記述を読んで,設問1~3に答えよ。 クレジットカード会社のC社では,キャッシュレス決済の普及に伴いカード決済システムのオンライントランザクションの処理量が増えている。情報システム部のFさんは,将来の処理量から懸念される性能低下の対策を検討することになった。 〔RDBMSの主な仕様〕 1. アクセス経路,区分化,再編成 (1)アクセス経路は,RDBMSによって表探索又は索引探索に決められる。表探索では,索引を使わずに先頭ページから順に全行を探索する。索引探索では,WHERE句中の述語に適した索引によって絞り込んでから表の行を読み込む。 (2)テーブルごとに一つ又は複数の列を区分キーとし,区分キーの値に基づいて物理的な表領域に分割することを区分化という。 (3)区分方法にはハッシュとレンジの二つがある。どちらも,テーブルを検索するSQL文のWHERE句の述語に区分キー列を指定すると,区分キー列で特定した区分だけを探索する。 ① ハッシュは,区分キー値を基にRDBMSが生成するハッシュ値によって一定数の区分に行を分配する方法である。 ② レンジは,区分キー値の範囲によって区分に行を分配する方法である。 (4)テーブル又は区分を再編成することによって,行を主キー順に物理的に並び替えることができる。また,各ページ中に指定した空き領域を予約することができる。 (5)INSERT文で行を挿入するとき,RDBMSは,主キー値の並びの中で,挿入行の主キー値に近い行が格納されているページに空き領域があればそのページに,なければ表領域の最後のページに格納する。最後のページに空き領域がなければ,新しいページを表領域の最後に追加する。 2. データ入出力とログ出力 (1)データとログはそれぞれ別のディスクに格納される。同じディスクに対し同時に入出力は行われないものとする。 (2)データ入出力とログ出力は4、000バイトのページ単位に行われる。 (3)データバッファはテーブルごとに確保される。 (4)ページをランダムに入出力する場合,SQL処理中のCPU処理と入出力処理は並行して行われない。これを同期データ入出力処理と呼び,SQL処理時間は次の式で近似できる。 SQL処理時間 = CPU時間 + 同期データ入出力処理時間 (5)ページを順次に入出力する場合,SQL処理中のCPU処理と入出力処理は並行して行われる。これを非同期データ入出力処理と呼び,SQL処理時間は次の式で近似できる。ここで関数MAXは引数のうち最も大きい値を返す。 SQL処理時間 = MAX(CPU時間,非同期データ入出力処理時間) (6)行を挿入,更新,削除した場合,変更内容がログとしてRDBMSに一つ存在するログバッファに書き込まれる。ログバッファが一杯の場合,トランザクションのINSERT文,UPDATE文,DELETE文の処理は待たされる。 (7)ログは,データより先にログバッファからディスクに出力される。これをログ出力処理と呼ぶ。このとき,トランザクションのコミットはログ出力処理の完了まで待たされる。ログ出力処理は,次のいずれかの事象を契機に行われる。 ① ログバッファが一杯になった。 ② トランザクションがコミット又はロールバックを行った。 ③ あるテーブルのデータバッファが変更ページによって一杯になった。 〔カード決済システムの概要〕 1. テーブル 主なテーブルのテーブル構造を図1,将来の容量見積りを表1に示す。各テーブルの主キーには索引が定義されており,索引キーを構成する列の順はテーブルの列の順と同じである。 図1 主なテーブルのテーブル構造(一部省略) 2. オーソリ処理(オンライン処理) オーソリ処理は,会員がカードで支払う際にカード有効期限,与信限度額を超過していないかなどを判定する処理である。判定した結果,可ならば審査結果を“Y”に,否ならば“N”に設定した行を“オーソリ履歴”テーブルに挿入する。 オーソリ処理は最大100多重で処理される。“オーソリ履歴”テーブルには直近5年分を保持する。 3. 利用明細抽出処理(バッチ処理) 請求書作成に必要な1か月分の利用明細の記録を“オーソリ履歴”テーブルから抽出しファイルに出力する。 〔参照処理の性能見積り〕 将来の処理時間が懸念される利用明細抽出処理のSQL文を,図2に示す。 図2 利用明細抽出処理のSQL文 Fさんは,利用明細抽出処理の処理時間を,次のように見積もった。 1. このSQL文での表の結合方法を調べたところ,“オーソリ履歴”テーブルを外側,“加盟店”テーブルを内側とする入れ子ループ法だった。“オーソリ履歴”テーブルのアクセス経路は表探索だったので,[a]ページを非同期に読み込む。 2. ディスク転送速度を100Mバイト/秒と仮定すれば,[a]ページを非同期に読み込むデータ入出力処理時間は,[b]秒である。 3. カード数を1、000万枚,カード・月当たり平均オーソリ回数を80回,審査結果が全て可であると仮定すると,“オーソリ履歴”テーブルの結果行数は,[c]行である。これに掛かるCPU時間は,96、000秒である。 4. この結合では,外側の表の結果行ごとに“加盟店”テーブルの主キー索引を索引探索し,“加盟店”テーブルを1行,ランダムに合計[d]回読み込む。 5. 索引はバッファヒット率100%,テーブルはバッファヒット率0%と仮定すれば,“加盟店”テーブルを合計で[e]ページを同期的に読み込むことになる。 同期読込みにページ当たり1ミリ秒掛かると仮定すれば,同期データ入出力処理時間は[f]秒である。 6. 内側の表の索引探索と結合に掛かるCPU時間は,1結果行当たり0.01ミリ秒掛かると仮定すれば,[g]秒である。 7. 外側の表のCPU時間は96、000秒,内側の表のCPU時間は[g]秒,内側の表の同期データ入出力処理時間は[f]秒なので,SQL文の処理時間を[h]秒と見積もった。 処理時間が長くなることが分かったので時間短縮のため,次の2案を検討した。 案1 “加盟店”テーブルのデータバッファを増やしバッファヒット率100%にする。 案2 “オーソリ履歴”テーブルの利用日列をキーとする副次索引を追加する。 〔“オーソリ履歴”テーブルの区分化〕 Fさんは,上司であるG氏から,次の課題の解決策の検討を依頼された。 課題1 月末近くに起きるオーソリ処理のINSERT文の性能低下を改善すること 課題2 将来懸念される利用明細抽出処理の処理時間を短縮すること 課題3 月初に行う“オーソリ履歴”テーブル再編成の処理時間を短縮すること Fさんは,課題を解決するために,“オーソリ履歴”テーブルを区分化することにし,区分キーについて表2に示す3案を評価した。いずれの案も60区分に行を均等に分配する前提であり,図2のSQL文を基に区分化に対応したSQL文を作成した。作成したSQL文のWHERE句を図3に示す。利用明細抽出処理及び再編成について,アクセスする総ページ数が最小になるようにジョブを設計した。このときジョブは,必要に応じて並列実行させる。 表2 課題ごとに各案を評価した結果(未完成) 〔更新処理の多重化〕 “オーソリ履歴”テーブルの請求済フラグと請求日を更新する処理も同様に,将来の処理時間が懸念された。更新処理のSQL文を図4に示す。更新処理はバッチ処理であり,カーソルを使用して1、000行を更新するごとにコミットする。 図4 更新処理のSQL文 Fさんは,次のように,区分化と併せて,更新処理を多重化することにした。 1. “オーソリ履歴”テーブルについて,カード番号,利用日の順の組で区分キーとし,レンジによって区分化する。 2. 区分ごとのジョブで更新処理を多重化する。 3. 更新処理を多重化しても競合しないように,各区分を異なるディスクに配置し,データバッファを十分に確保する。 設問1 〔参照処理の性能見積り〕について,(1)~(3)に答えよ。 (1)本文中の[a]~[h]に入れる適切な数値を答えよ。 (2)案1について,“加盟店”テーブルのデータバッファを増やすのはなぜか。また,“オーソリ履歴”テーブルはデータバッファを増やさないのはなぜか。アクセス経路に着目し,それぞれ理由を25字以内で述べよ。 (3)案2を適用した場合,オーソリ処理の処理時間が長くなると考えられる。その理由を25字以内で述べよ。 設問2 〔“オーソリ履歴”テーブルの区分化〕について,(1)~(4)に答えよ。 (1)課題1について,案Aと案Bは案Cに比べてオーソリ処理のINSERT文の性能が良いと考えられる。その理由を25字以内で具体的に述べよ。 (2)課題2について,区分限定の表探索を行う場合,1ジョブが探索する区分数及びページ数の最小値はそれぞれ幾らか。表2中の[イ],[ロ]に入れる適切な数値を答えよ。 (3)課題2について,案Aではカード番号にBETWEEN述語を追加しても改善効果を得られないと考えられる。その理由を30字以内で具体的に述べよ。 (4)課題3について,特に案Cは,区分キーの特徴から,案Aと案Bに比べて再編成の効率が良いと考えられる。その理由を20字以内で具体的に述べよ。 設問3 〔更新処理の多重化〕について,(1),(2)に答えよ。 (1)ジョブの多重度を幾ら増やしても,それ以上は更新処理全体の処理時間を短くできない限界がある。このときボトルネックになるのはログである。その理由をRDBMSの仕様に基づいて30字以内で述べよ。 (2)更新処理では1、000行更新するごとにコミットしているが,仮に1行更新するごとにコミットすると,更新処理の処理時間のうち何がどのように変わるか。本文中の用語を用いて25字以内で述べよ。
図1 主なテーブルのテーブル構造(一部省略)。加盟店とオーソリ履歴の主な列を括弧内に列挙した、主なテーブル構造の概要図。
図1 主なテーブルのテーブル構造(一部省略)。加盟店とオーソリ履歴の主な列を括弧内に列挙した、主なテーブル構造の概要図。
表1 主なテーブルの将来の容量見積り。加盟店とオーソリ履歴について、行長、見積行数、1ページ当たりの行数、ページ数、容量を示す表。
表1 主なテーブルの将来の容量見積り。加盟店とオーソリ履歴について、行長、見積行数、1ページ当たりの行数、ページ数、容量を示す表。
図2 利用明細抽出処理のSQL文。オーソリ履歴と加盟店を結合し、審査結果と利用日で絞り込む利用明細抽出SQL、注記を示す。
図2 利用明細抽出処理のSQL文。オーソリ履歴と加盟店を結合し、審査結果と利用日で絞り込む利用明細抽出SQL、注記を示す。
表2 課題ごとに各案を評価した結果(未完成)。区分方法と区分キーが異なる案A~Cについて、三つの課題への評価と探索区分・ページ数を整理した表。
表2 課題ごとに各案を評価した結果(未完成)。区分方法と区分キーが異なる案A~Cについて、三つの課題への評価と探索区分・ページ数を整理した表。
図3 区分化に対応したSQL文のWHERE句。審査結果、利用日、カード番号、加盟店番号を条件とする区分化対応SQLのWHERE句と注記。
図3 区分化に対応したSQL文のWHERE句。審査結果、利用日、カード番号、加盟店番号を条件とする区分化対応SQLのWHERE句と注記。
図4 更新処理のSQL文。請求済フラグと請求日を更新し、利用日とカード番号の範囲で絞り込む更新SQLと注記。
図4 更新処理のSQL文。請求済フラグと請求日を更新し、利用日とカード番号の範囲で絞り込む更新SQLと注記。
解き方のヒントを見る

前提をそろえて性能を比べる

性能を考えるときは、方式名や印象だけで判断せず、同じ前提・同じ処理範囲・同じ評価指標にそろえて、各案を公平に比較できる状態かを確認しましょう。

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

各処理方式を比べる前提がそろっているかに注目し、対象となる処理の範囲、入力条件、評価する時間や資源の観点が同じ基準で扱われているかを丁寧に確認しましょう。

視点

性能評価では、処理の対象・前提条件・評価軸を切り分け、比較対象が同じ条件で整理されているかを確認することが重要です。

確認ポイント

  • 比較する処理の範囲がそろっているか
  • 入力条件や前提が同じ基準で整理されているか
  • 性能を測る観点が一貫しているか
正解と解説を見る

解説

本問は、RDBMSのアクセス経路、バッファ、区分化、再編成、ログ出力を題材に、性能見積りと設計判断を問う問題です。

問題の全体像

カード決済量の増加を背景に、オーソリ履歴を対象とした参照・挿入・更新処理の性能改善を検討する。設問1は入れ子ループ結合の処理時間とバッファ効果、設問2は区分方式と区分キーの選択、設問3は更新処理を多重化した際のログのボトルネックを問う。

設問1(1)(a)

オーソリ履歴は480億行で、1ページ当たり20行なので、表探索で読むページ数は480億÷20=24億ページとなる。したがって[a]は2、400、000、000。

設問1(1)(b)

24億ページを1ページ4、000バイト、転送速度100Mバイト/秒で読む。24億×4、000÷100、000、000=96、000秒となり、[b]は96、000。

設問1(1)(c)

カード1、000万枚について、1カード・月当たり80回のオーソリがあり、対象月の結果行数は1、000万×80=8億行。したがって[c]は800、000、000。

設問1(1)(d)

内側の加盟店表は外側の結果行ごとに主キー索引で1行を検索する。外側の結果行数が8億行なので、読み込み回数も8億回となり、[d]は800、000、000。

設問1(1)(e)

索引は全てバッファヒットするが、加盟店表はバッファヒット率0%です。そのため各検索で表ページを読むものとして、同期読み込みページ数は8億ページとなり、[e]は800、000、000。

設問1(1)(f)

加盟店表の同期読み込みは8億ページで、1ページ1ミリ秒。8億ミリ秒を1、000で割ると800、000秒となり、[f]は800、000。

設問1(1)(g)

内側表の索引探索・結合CPU時間は、8億結果行×0.01ミリ秒=800万ミリ秒=8、000秒。したがって[g]は8、000。

設問1(1)(h)

外側表はCPU96、000秒と非同期読込み96、000秒が並行するため、処理時間は96、000秒。内側表はCPU8、000秒と同期読込み800、000秒を加え808、000秒で、合計904、000秒となる。[h]は904、000。

設問1(2)(加盟店)

加盟店表は索引探索に伴うランダムアクセスを大量に行う。データバッファを増やして表ページを保持できれば、ランダムアクセスの処理時間を短縮できる。25字以内では「ランダムアクセスの処理時間を短縮できるから」とまとめる。

設問1(2)(オーソリ履歴)

オーソリ履歴は表探索でページを順次に読むため、非同期読込みが前提となる。バッファを増やしても順次アクセスの処理時間には影響しない。

設問1(3)

利用日列の副次索引を追加すると、オーソリ履歴へのINSERT時に索引も更新する必要がある。したがって挿入時に更新する索引が増え、処理時間が長くなる。

設問2(1)

課題1はINSERT性能です。カード番号を区分キーにする案A・Bでは、挿入される行が複数の区分に分散する。一方、利用日をキーにする案Cでは同じ月の挿入が同一または限られた区分に集中しやすい。

設問2(2)(イ)

案Cは利用日を1か月単位のレンジ区分にしている。検索対象は請求対象月の1か月なので、該当する区分は最小1区分となる。したがって[イ]は1。

設問2(2)(ロ)

オーソリ履歴全体のページ数24億を60区分に均等分配する。1区分のページ数は24億÷60=4、000万ページであり、[ロ]は40、000、000。

設問2(3)

案Aはハッシュ区分であり、カード番号の範囲をWHERE句に追加しても、ハッシュ値から区分が決まるため範囲で探索区分を限定できない。公式解答例では「区分方法がハッシュでは探索する区分を限定できないから」としている。

設問2(4)

案Cは利用日によるレンジ区分なので、月初の再編成では対象月など必要な1区分だけを再編成できる。20字以内では「1区分だけを再編成すれば良いから」と押さえる。

設問3(1)

更新を多重化しても、コミットはログ出力処理の完了まで待たされる。また、ログ出力は一つのログを対象に行われ、並列化・逐次化の制約がある。したがってログ出力処理がボトルネックになる。

設問3(2)

1行更新ごとにコミットすると、コミット回数が増え、そのたびにログ出力処理の完了を待つ。本文の用語では、ログ出力処理の待ち時間の合計、またはコミット時の待ち時間の合計が長くなると説明する。

学習のポイント

ページ単位の性能計算と、区分キー・ログ処理の特性を結び付けて説明する力を養う。

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

関連する過去問一覧

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