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

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

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

問題

問3 バッチ処理の性能設計に関する次の記述を読んで,設問1,2に答えよ。 クレジットカード会社として国内外で事業を展開しているE社は,カード利用の増加に伴い,売上登録処理を見直すことにした。Fさんがその見直しを担当した。 〔カード業務システムの概要〕 1. カード利用者による商品の購入から入金までの概要 (1) E社に登録している加盟店で商品を購入したカード利用者(以下,利用者という)は,商品の代金をカードで支払い,カード売上票の控えを受け取る。 (2) 加盟店は,カード売上票を売上票保管センタに送る。当該センタは,毎月,クレジットカード会社ごとに,カード売上票を基に売上明細ファイルを作成し,各クレジットカード会社に送る。 (3) E社は,毎月末の売上登録処理によって,売上明細ファイルを基に各カードの利用残高を更新する。さらに,利用明細書作成処理によって,カード番号,利用年月日,利用店名,利用金額,支払区分,支払金額,支払金額合計,当月獲得ポイント数などを記載したカード利用明細書を作成し,各利用者に送る。 (4) 利用者は,代金を銀行口座振替にすることも,ATMから入金することもできる。入金した時点で,即時に入金トランザクションが利用残高を更新する。 2. 売上登録処理の概要 (1) 売上登録処理で使用する主なテーブル構造を図1に,主な列の説明を表1に,主なテーブル・列の統計情報及び索引定義情報を表2に示す。ここで,ページ及び行は追加された順に並び,同じページに異なるテーブルの行が格納されることはない。また,ページは,ページ単位で順次又はランダムに磁気ディスク装置からバッファに読み込まれる。 図1 主なテーブル構造(一部省略) 表1 主な列の説明 表2 主なテーブル・列の統計情報及び索引定義情報 (2) 売上登録処理は,次の三つのジョブから構成される。現行のジョブ2で実行するプログラムの処理の流れとSQL文を,図2に示す。 なお,全てのジョブには,一意なジョブIDを割り当てる。また,ISOLATIONレベルはREAD COMMITTEDであり,排他制御は行単位で行う。 ジョブ1 売上明細ファイルの各レコードに登録年月を付加し,加盟店コード,利用年月日順にソートした後,“売上明細”テーブルに追加する。 ジョブ2 “売上明細”テーブルから1行読み込むごとに,カード番号をキーにして“利用残高”テーブルから1行読み込み,利用残高に利用金額を加算する(図2の②)。カード利用明細書の作成に必要な情報を付加した行を,“利用明細”テーブルに追加する(図2の③)。 ジョブ3 当月を含む直近10か月以外の行を,“売上明細”テーブルから削除する。表2の統計情報は,ジョブ3が終了した直後の値である。 図2 現行のジョブ2で実行するプログラムの処理の流れとSQL文(一部省略) 〔売上登録処理の現状調査及び見直し〕 1. Fさんは売上登録処理の現状を調査し,その結果を次のようにまとめた。 (1) 10か月間に利用されたカードは,[ア]枚であった。毎月のカード利用明細書には,カード1枚当たり平均[イ]件の利用明細が印字されていた。 (2) ジョブ2は,毎月平均[ウ]行の売上明細を処理するために,“売上明細”テーブルから副次索引を用いて[エ]ページを順次に読み込み,行がカード番号順に格納されている“利用残高”テーブルから主索引を用いて延べ最大[オ]ページをランダムに読み込んでいた。 (3) ジョブ2は,重複していない売上明細連番の範囲を指定することで,多重処理できる設計になっている。しかし,多重処理すると“[カ]”テーブルの行でデッドロックが発生するので,これまでは1多重で実行していた。 (4) ジョブ2は,最後に1回だけ同期を取っていた。これは,ジョブ2が異常終了(以下,失敗という)した場合,失敗の原因を取り除いた後,ジョブ2を最初から単純に再実行できるからであった。 (5) 処理量が増えるにつれて,メモリリークなどによってジョブ2が失敗したとき,ジョブ2の終了直前にRDBMSによって行われる[キ]処理の時間が長くなるおそれがある。 (6) 処理量が増えるにつれて,“利用残高”テーブルを更新する入金トランザクションの排他ロック待ち時間が長くなるおそれがある。 2. Fさんの上司であるG部長は,ジョブ2の見直しについて次のように指示した。 指示① 多重処理でもジョブ2でデッドロックが発生しないようにすること 指示② ジョブ2の途中から処理を再開できるように,チェックポイントリスタート機能(以下,C/R機能という)を追加すること 3. Fさんは,G部長の指示に対し,売上登録処理を変更した。その変更内容を表3に示す。 表3 売上登録処理の変更内容 〔チェックポイントリスタート機能の概要〕 Fさんは,G部長の指示②に対し,次のようにジョブ2が実行するプログラムにC/R機能を追加した。C/R機能を追加した後のプログラムの処理の流れとSQL文を,図3に示す。図3中の破線で囲んだ部分は,FさんがC/R機能を追加するために変更した箇所である。 1. “チェックポイント”テーブル(以下,“CKPT”テーブルという)を定義する。 2. ジョブ2は,“売上明細”テーブルのN行を処理するごとに,そのときの売上明細連番をチェックポイントとして“CKPT”テーブルに記録し,かつ,COMMIT文を発行することで同期を取る。 3. Kを0以上の整数とするとき,2. の処理の(K+1)回目の繰返しの途中で処理が失敗した場合,その原因を取り除いて,同じジョブIDのジョブを再実行する。そのとき,“売上明細”テーブルのジョブ2で処理すべき行全体の中の(N×K+1)行目から処理を再開する。 図3 C/R機能を追加した後のプログラムの処理の流れとSQL文(一部省略) 設問1 〔売上登録処理の現状調査及び見直し〕について,(1)~(3)に答えよ。 (1) [ア]~[キ]に入れる適切な字句を答えよ。 なお,月ごとに利用されるカード番号に偏りはないものとする。また,索引のバッファヒット率は100%であり,ページ中の行をアクセスするとき,次にアクセスするページはバッファにないものとする。 (2) 変更前(現行)のジョブ2を多重処理すると“[カ]”テーブルの行でデッドロックが発生する理由を,関係する列名を含めて30字以内で述べよ。 (3) 売上登録処理を変更した後にジョブ2を1多重で実行したところ,“利用残高”テーブルから読み込まれるページ数が減り,処理時間が短縮した。ジョブ1で売上明細ファイルのソート順を変えたことによって,なぜジョブ2で“利用残高”テーブルから読み込まれるページ数が減ったのか。その読み込まれるページ数とページ数が減った理由を,30字以内で述べよ。 設問2 〔チェックポイントリスタート機能の概要〕について,(1)~(4)に答えよ。 (1) “CKPT”テーブルのテーブル構造を示せ。主キーには下線を引くこと。 (2) 図3では同期を取る処理が漏れている。ジョブが失敗した後に同じジョブを再実行したとき,(N×K+1)行目から処理を再開するためには,図3中に同期を取る処理が必要である。図3中の④~⑧のうち,どの番号の後に同期を取る処理を挿入すべきか。適切な番号を一つ答えよ。 (3) 図3中の③のSELECT文においてWHERE句に必ずしも必要でない述語がある。その述語とは何かを答え,必要でない理由を,30字以内で述べよ。 なお,ホスト変数には適切な値を設定して,多重処理を行うものとする。 (4) 排他ロック待ちタイムアウト時間がT秒のとき,図3中の④,⑤を合わせた処理に平均A秒,⑥の処理に平均B秒,同期を取る処理に平均C秒の時間を要すると仮定する。この場合,他のトランザクションに排他ロック待ちタイムアウトをさせないためには,少なくともN行更新するごとに同期を取らなければならない。Nを見積もる次の計算式の[a],[b]に入れる適切な式をT,A,B及びCを用いて答えよ。 N < [a]/[b]
図1 主なテーブル構造(一部省略)。加盟店、売上明細、利用残高、利用明細の4テーブルの関係スキーマ。主キー(売上明細連番、カード番号、利用明細連番等)に実線下線、外部キー(加盟店コード、カード番号)に破線下線が付いている。
図1 主なテーブル構造(一部省略)。加盟店、売上明細、利用残高、利用明細の4テーブルの関係スキーマ。主キー(売上明細連番、カード番号、利用明細連番等)に実線下線、外部キー(加盟店コード、カード番号)に破線下線が付いている。
表1 主な列の説明。加盟店コード、売上明細連番、登録年月、カード番号、利用金額、利用年月日、利用可能枠、利用残高、利用明細連番の各列について意味を説明した表。
表1 主な列の説明。加盟店コード、売上明細連番、登録年月、カード番号、利用金額、利用年月日、利用可能枠、利用残高、利用明細連番の各列について意味を説明した表。
表2 主なテーブル・列の統計情報及び索引定義情報。売上明細(ページ当たり20行、売上明細連番200,000,000値で主索引、登録年月10値で副次索引、カード番号2,000,000値)と利用残高(ページ当たり10行、カード番号5,000,000値で主索引)の統計情報と索引定義、および注記。
表2 主なテーブル・列の統計情報及び索引定義情報。売上明細(ページ当たり20行、売上明細連番200,000,000値で主索引、登録年月10値で副次索引、カード番号2,000,000値)と利用残高(ページ当たり10行、カード番号5,000,000値で主索引)の統計情報と索引定義、および注記。
図2 現行のジョブ2で実行するプログラムの処理の流れとSQL文(一部省略)。①カーソル宣言・OPEN、②FETCHと利用残高のUPDATE、③利用明細への追加、④ループ判定、⑤CLOSE、⑥同期を取ってジョブを終了、の処理の流れとSQL文。
図2 現行のジョブ2で実行するプログラムの処理の流れとSQL文(一部省略)。①カーソル宣言・OPEN、②FETCHと利用残高のUPDATE、③利用明細への追加、④ループ判定、⑤CLOSE、⑥同期を取ってジョブを終了、の処理の流れとSQL文。
表3 売上登録処理の変更内容。ジョブ1の売上明細ファイルのソート順を加盟店コード・利用年月日からカード番号・利用年月日へ変え、ジョブ2の同期を取る契機を最後に1回だけから一定のN行を処理するごとへ変える変更内容。
表3 売上登録処理の変更内容。ジョブ1の売上明細ファイルのソート順を加盟店コード・利用年月日からカード番号・利用年月日へ変え、ジョブ2の同期を取る契機を最後に1回だけから一定のN行を処理するごとへ変える変更内容。
図3 C/R機能を追加した後のプログラムの処理の流れとSQL文(一部省略)。①~⑩の処理の流れ。CKPT連番の取得と行の追加(②)、処理連番条件とORDER BYを加えたカーソル(③)、N回ごとのCKPT更新(⑥)、CKPT行の削除(⑨)の変更箇所を破線で囲んで示す。
図3 C/R機能を追加した後のプログラムの処理の流れとSQL文(一部省略)。①~⑩の処理の流れ。CKPT連番の取得と行の追加(②)、処理連番条件とORDER BYを加えたカーソル(③)、N回ごとのCKPT更新(⑥)、CKPT行の削除(⑨)の変更箇所を破線で囲んで示す。
解き方のヒントを見る

前提条件を整理してから設問に向き合う

処理方式を扱う問題では、結論を急ぐ前に、問題中で示された前提や条件を自分の言葉で書き出すことが有効です。どの条件がどの問いに関係するかを対応づけ、根拠となる記述を確かめながら考えを進めましょう。

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

確認すべき観点は一つで、問題中に示された前提条件を漏れなく把握できているかどうかです。数値や単位、適用範囲などの記述を先に整理し、それぞれの問いがどの条件に依存しているかを確かめてください。

視点

設計や見積りを問う問題では、一般論の知識だけで判断すると、問題固有の条件を見落としやすくなります。まず問題中で明示されている条件を書き出し、次に各問いがどの条件を前提にしているかを結び付けると、判断の根拠が明確になります。知識は、整理した条件に照らして使うものと位置づけるとよいでしょう。

確認ポイント

  • 問題中に明示された条件(数値・単位・範囲など)を書き出して整理したか
  • 各問いがどの条件を前提にしているかを対応づけたか
  • 自分の判断が一般論ではなく問題中の記述に基づいているか確かめたか
正解と解説を見る

解説

クレジットカード会社の売上登録バッチを題材に、表2の統計情報から行数とページ数を見積もる力を問う問題です。あわせて、多重処理で起きるデッドロックの原因、ソート順の変更で読込みがランダムから順次に変わる効果、チェックポイントリスタート機能のテーブル設計と同期位置、冗長な述語、コミット間隔Nの見積り式が問われています。

問題の全体像

E社では毎月末、ジョブ1が売上明細ファイルを“売上明細”テーブルに追加します。ジョブ2はそれを1行ずつ読み、“利用残高”テーブルを更新して“利用明細”テーブルに行を追加します。現行のジョブ2には次の問題があります。1多重でしか動かせない、最後に1回しか同期を取らない、失敗時のロールバックが長くなる、入金トランザクションのロック待ちが長くなる。そこでFさんは、ソート順をカード番号、利用年月日の順に変え、N行ごとに同期を取るチェックポイントリスタート(C/R)機能を追加しました。出題趣旨では、アクセスパスで決まる読込み順序を予測して性能を見積もる力と、多重処理や途中再開を実現するテーブルとSQLを設計する力を問うとしています。

設問1(1)(ア)

表2の統計情報は、ジョブ3の終了直後、つまり直近10か月分だけが“売上明細”に残っている状態の値です。“売上明細”のカード番号の列値個数は2、000、000なので、10か月間に使われたカードは2、000、000枚になります。公式解答例も2、000、000です。“利用残高”のカード番号5、000、000は発行済みのカード全体の数なので、取り違えないようにしましょう。

設問1(1)(イ)

“売上明細”の行数は売上明細連番の列値個数で200、000、000行です。10か月分なので、1か月当たり20、000、000行になります。設問には、月ごとに使われるカード番号に偏りはないという条件があります。そのため毎月2、000、000枚全てが使われると考え、20、000、000÷2、000、000=10件になります。公式解答例も10です。

設問1(1)(ウ)

ジョブ2は当月の登録年月の行だけを処理します。200、000、000行÷10か月=20、000、000行なので、公式解答例は20、000、000です。

設問1(1)(エ)

ページと行は追加された順に並ぶので、当月分の行は連続したページに入っています。副次索引(登録年月)で順次に読めば、1ページに20行ずつまとめて読めます。20、000、000行÷20行=1、000、000ページとなり、公式解答例も1、000、000です。

設問1(1)(オ)

現行のソート順は加盟店コード、利用年月日です。そのため、カード番号の順に並んでいる“利用残高”へのアクセスは順不同(ランダム)になります。設問の前提では、次にアクセスするページはバッファにありません。したがって1行更新するたびに1ページ読むことになり、延べ最大20、000、000ページになります。公式解答例も20、000、000です。採点講評では、オの正答率が低かったとし、バッファヒットしないランダムアクセスでは1行ごとに1ページを読む必要があると指摘しています。

設問1(1)(カ)

多重処理で更新が衝突するのは、どのジョブもUPDATEで更新する“利用残高”テーブルです。“売上明細”は読むだけで、“利用明細”には追加するだけなので、行ロックが競合しません。公式解答例は“利用残高”です。

設問1(1)(キ)

ジョブ2は最後に1回しか同期を取りません。途中で失敗すると、それまでの大量の更新をRDBMSが全て取り消すことになります。処理量が増えるほど取り消しの時間も長くなります。公式解答例は「ロールバック」または「アボート」です。採点講評では、設問2はこのロールバック時間の問題を解決する設計を問うものであり、キを正しく答えていながら設問2を正しく解答できていない受験者がいたのは惜しまれる、と述べています。

設問1(2)

各ジョブは重複しない売上明細連番の範囲を担当しますが、行は加盟店コード順に並んでいます。そのため、同じカード番号の売上が複数のジョブの範囲にばらばらの順序で含まれます。例えばジョブXがカードP→Qの順に、ジョブYがQ→Pの順に“利用残高”の行をロックすると、互いに相手のロック解除を待つ状態になります。公式解答例は「同じカード番号の行を異なる順番で更新するから」です。30字以内の答案では、列名「カード番号」と「更新順序が異なる」ことの二つを入れます。

設問1(3)(ページ数)

変更後はソート順がカード番号、利用年月日になり、“売上明細”の当月分もカード番号の順に並びます。“利用残高”もカード番号の順に格納されているので、読込みは先頭から末尾に向かって一方向に進み、同じページを読み直すことはありません。多く見積もっても“利用残高”の全ページ数、つまり5、000、000行÷10行=500、000ページになります。公式解答例も500、000です。

設問1(3)(理由)

公式解答例は「ページの読み込みがランダムから順次に変わったから」です。答案では、アクセスの仕方がランダムから順次に変わったこと(その結果、1ページ内の複数行をまとめて処理できること)を書きます。採点講評では、「カード番号、利用年月日順に読み込んだから」のようにソート順の列名を書いただけの解答は、問題文の読み替えにすぎず正しい解答にならないと注意しています。

設問2(1)

図3を見ると、CKPTテーブルの使い方は次のとおりです。②で「WHERE ジョブID = :ジョブID」によりCKPT連番を1行取得する。②-1でジョブIDだけをINSERTする。⑥でジョブIDを条件にCKPT連番をUPDATEする。⑨でジョブIDを条件にDELETEする。1ジョブにつき1行で、ジョブIDで行を一意に特定できます。公式解答例は「CKPT(ジョブID,CKPT連番)」で、主キー(下線)はジョブIDです。

設問2(2)

(N×K+1)行目から正しく再開するには、N行分の更新と、その最後の売上明細連番をCKPT連番に記録する更新とを、同じ時点で確定させる必要があります。⑥でCKPTテーブルを更新した直後にCOMMITすれば、処理済みの位置と実際の更新内容が一致します。カーソルはWITH HOLDなので、COMMITの後も処理を続けられます。公式解答例は⑥です。

設問2(3)(述語)

公式解答例は「登録年月 = :登録年月」です。採点講評では、ORDER BY句は述語ではないこと、また多重処理を前提にしているので担当範囲を指定するBETWEEN述語は必要であることを指摘しています。問題の前提をよく読んでいないと思われるこうした誤答が散見されたとしています。

設問2(3)(理由)

売上明細連番は、行が追加されたときに一意かつ昇順で付与されます。そのため、ホスト変数で当月分の連番範囲を適切に与えれば、その範囲の行の登録年月は自動的に当月に決まります。公式解答例には、「売上明細連番に対するBETWEEN述語で代替できるから」「売上明細連番が決まれば登録年月は一意に決まるから」「登録年月は利用明細連番に従属しているから」の三つが挙げられています。30字以内の答案では、連番の範囲指定で登録年月の条件を代替できる、つまり連番から登録年月が決まるという要素を書きます。

設問2(4)(a)

1回の同期区間では、次の処理を行う間ずっと“利用残高”の行を排他ロックし続けます。④⑤をN回(N×A秒)、⑥を1回(B秒)、同期を1回(C秒)です。この合計がタイムアウト時間Tを超えなければ、他のトランザクションはタイムアウトしません。採点講評でも、T>N×A+B+Cの式を満たす必要があると分かれば解答を導けるとしています。Nについて変形すると、N<(T−B−C)/Aとなり、分子aは公式解答例のとおりT−B−Cです。

設問2(4)(b)

同じ変形で、Nに掛かっている係数、つまり1行当たりの④⑤の処理時間Aが分母になります。公式解答例はAです。

学習のポイント

統計情報を使ったページ数の見積り(順次読込みとランダム読込みの違い)を練習しましょう。更新順序とデッドロックの関係、COMMITの間隔とロールバック時間・ロック待ちの関係、そしてC/R機能で記録と同期を同じトランザクションにまとめる設計も重点です。

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

関連する過去問一覧

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