ホーム > データベーススペシャリスト試験 > 2021年
データベーススペシャリスト試験 2021年 午後1 問02
データベースの実装に関する次の記述を読んで、設問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に示す。 各テーブルの主キーには索引が定義されており, 索引キーを構成する列の順はテーブルの列の順と同じである。


2.オーソリ処理 (オンライン処理)
オーソリ処理は, 会員がカードで支払う際にカード有効期限, 与信限度額を超過していないかなどを判定する処理である。 判定した結果, 可ならば審査結果を'Y' に,否ならば 'N' に設定した行を “オーソリ履歴” テーブルに挿入する。オーソリ処理は最大 100 多重で処理される。 “オーソリ履歴” テーブルには直近5年分を保持する。
3.利用明細抽出処理 (バッチ処理)
請求書作成に必要な1か月分の利用明細の記録を “オーソリ履歴” テーブルから抽出しファイルに出力する。
〔参照処理の性能見積り〕
将来の処理時間が懸念される利用明細抽出処理の SQL文を、 図2に示す。

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に示す。 利用明細抽出処理及び再編成について,アクセスする総ページ数が最小になるようにジョブを設計した。 このときジョブは,必要に応じて並列実行させる。


〔更新処理の多重化〕
“オーソリ履歴” テーブルの請求済フラグと請求日を更新する処理も同様に, 将来の処理時間が懸念された。 更新処理の SQL 文を図4に示す。 更新処理はバッチ処理であり,カーソルを使用して1,000行を更新するごとにコミットする。

Fさんは,次のように, 区分化と併せて、更新処理を多重化することにした。
1.“オーソリ履歴” テーブルについて, カード番号, 利用日の順の組で区分キーとし, レンジによって区分化する。
2.区分ごとのジョブで更新処理を多重化する。
3.更新処理を多重化しても競合しないように, 各区分を異なるディスクに配置し,データバッファを十分に確保する。
設問1(1):〔参照処理の性能見積り〕について,(1)〜(3)に答えよ。
本文中の(a)〜(h)に入れる適切な数値を答えよ。
模範解答
a:2,400,000,000
b:96,000
c:800,000,000
d:800,000,000
e:800,000,000
f:800,000
g:8,000
h:904,000<
解説
1. キーワード・論点整理
- ネストループ結合(入れ子ループ法):
‒ 外側表(オーソリ履歴)を表探索(全表順次読込み)
‒ 内側表(加盟店)を索引探索(ランダム読込み) - データ入出力処理のモデル式:
‒ 同期データ入出力処理時間 = 各ページI/O時間×ページ数
‒ 非同期データ入出力処理時間 = 各ページI/O時間×ページ数
‒ SQL処理時間(外側順次読み込み)
= MAX(CPU時間, 非同期データ入出力処理時間) - バッファヒット率:
‒ 索引バッファヒット率100% → 索引ページはディスクI/O不要
‒ データバッファヒット率0% → データページは全てディスクI/O - 単位の変換:ページ数⇔バイト数⇔秒数
2. (a)~(h) の計算過程と解答
3. なぜこの解答になるのか
-
(a),(b) 非同期読み込みの計算
問文より“オーソリ履歴” テーブルを外側…, アクセス経路は表探索だったので, (a)ページを非同期に読み込む。
表1から「オーソリ履歴」の行数480億行・1ページ20行を使ってページ数を求め、ディスク転送速度100Mバイト/秒で時間を算出します。 -
(c) 結果行数
問文よりカード数を 1,000万枚, カード・月当たり平均オーソリ回数を80回…, 結果行数は (c)行
単純に掛け算です。 -
(d),(e),(f) 内側表“加盟店”のI/O
問文より外側の結果行ごとに “加盟店” テーブルの主キー索引を索引探索し, “加盟店” テーブルを1行, ランダムに合計(d)回読み込む。
索引はバッファヒット率100%, テーブルはバッファヒット率0%と仮定すれば, “加盟店” テーブルを合計で (e)ページを同期的に読み込む。
索引は全てキャッシュ内にあるためI/O不要。データ行は全てディスクからの読み込みで、1行≒1ページとして8億ページ。
さらに「同期読込みにページ当たり1ミリ秒掛かる」とあるので時間を求めます。 -
(g) 内側CPU時間
問文より内側の表の索引探索と結合に掛かる CPU 時間は,1 結果行当たり 0.01 ミリ秒…
8億行×0.01ms。 -
(h) 全体SQL処理時間
問文より外側の表の CPU 時間は96,000秒, 内側の表の CPU 時間は(g)秒, 内側の表の同期データ入出力処理時間は(f)秒なので, SQL文の処理時間を(h)秒と見積もった。
外側表の非同期I/Oと外側CPUは並列化されるため重畳せず、MAX(96,000,96,000)=96,000秒。その後に内側のCPU/I/Oが直列加算されます。
4. 受験上の注意・ひっかけポイント
- 表探索(全表順次読込み)は非同期I/O、 索引探索(ランダムI/O)は同期I/Oと区別する点
- 単位変換ミス(ページ数⇔バイト数⇔秒)に注意
- 非同期I/Oでは「CPUとI/Oの重畳」を必ず意識し、
MAX
式を適用すること - 内側と外側でI/Oモデルが異なる点に注意
- バッファヒット率の仮定を間違えると、I/O回数が大きく変わる
5. 試験対策ポイント
- ネストループ結合のコストモデル(外側スキャン+内側ランダムアクセス)をおさえる
- 同期/非同期データ入出力処理時間の式を正確に覚える
- ページ単位、バイト単位、秒単位の換算に強くなる
- バッファヒット率の効果を理解し、I/O回数を正確に算出する
- 問文中の前提条件(ディスク速度、バッファヒット率、CPU時間モデル)を見落とさない
これらを踏まえて練習問題を繰り返し解くことで、複雑な性能計算にも対応できるようになります。
設問1(2):〔参照処理の性能見積り〕について,(1)〜(3)に答えよ。
案1 について, “加盟店” テーブルのデータバッファを増やすのはなぜか。 また,“オーソリ履歴” テーブルはデータバッファを増やさないのはなぜか。アクセス経路に着目し, それぞれ理由を25字以内で述べよ。
模範解答
加盟店:ランダムアクセスの処理時間を短縮できるから
オーソリ履歴:順次アクセスの処理時間に影響しないから
解説
模範解答の論点整理
- コアキーワード:索引探索=ランダムアクセス、表探索=順次アクセス、同期/非同期I/O、バッファヒット率
解答が導かれる理由の詳細説明
-
「加盟店」テーブル
- 問題文:
「外側の表の結果行ごとに “加盟店” テーブルの主キー索引を索引探索し、…ランダムに合計(d)回読み込む。」
- 索引探索はページをランダムに読み込むため、同期データ入出力処理となり、バッファヒット率を上げることでディスクアクセス回数を減らし、待ち時間を短縮できる。
- 問題文:
-
「オーソリ履歴」テーブル
- 問題文:
「“オーソリ履歴” テーブルのアクセス経路は表探索だったので、(a)ページを非同期に読み込む。」
- 表探索は先頭ページから順次に読み込む非同期データ入出力で、I/OとCPU処理を重ねて並行実行するため、バッファヒット率向上による性能改善効果がほとんどない。
- 問題文:
受験者の誤りやすいポイント
- 「順次アクセス=バッファ不要」と覚えた後に、
→「非同期I/Oでもバッファ増強が効く」と誤解しやすい。 - 「索引探索なら必ず高速」と考え、バッファの有無を無視すると、ランダムI/O時の待機時間を見落とす。
試験対策として押さえるべきポイント
- アクセス経路とI/O特性の対応
- 索引探索=ランダムI/O(同期的にCPU待ち)
- 表探索=順次I/O(非同期でCPUと重畳)
- バッファヒット率の効果範囲
- ランダムI/O時:ヒット率向上が処理時間短縮に直結
- 順次I/O時:多少のヒットはあってもI/OとCPUの重畳により改善効果は限定的
- 設問文中のキーワード探し
- 「ランダムに読み込む」「同期データ入出力」「非同期データ入出力」を確実にキャッチすること
- 字数制限の対策
- 25字以内で「原因」と「効果」を簡潔に述べる練習をしておくこと。
設問1(3):〔参照処理の性能見積り〕について,(1)〜(3)に答えよ。
案2を適用した場合, オーソリ処理の処理時間が長くなると考えられる。その理由を25字以内で述べよ。
模範解答
行の挿入時に更新する索引が増えるから
解説
キーワード整理
- 「副次索引(利用日列をキーとする索引)」
- 挿入時の索引更新コスト
- RDBMSの索引メンテナンス
解答の論拠
案2では、“オーソリ履歴” テーブルに「利用日列をキーとする副次索引」を追加します。
これにより、オーソリ処理のたびに新規行をINSERTするとき、主キー索引に加えて副次索引も更新が発生します。
これにより、オーソリ処理のたびに新規行をINSERTするとき、主キー索引に加えて副次索引も更新が発生します。
【問題文】の仕様から:
「INSERT 文で行を挿入するとき, RDBMS は...挿入行の主キー値に近い行が格納されているページに空き領域があれば...」
「行を挿入,更新、削除した場合, 変更内容がログとして RDBMS に一つ存在するログバッファに書き込まれる。」
索引を追加すると、
- 該当索引のツリー構造やハッシュ構造 に対してもノード(葉ページ)挿入や分割が発生し、
- ログ出力 や ディスクI/O が増大し、
- オーソリ処理(INSERT多重実行)の同期データ入出力処理時間やCPU時間 が増加します。
したがって、案2を適用すると、INSERT時に更新すべき索引数が増えるため、オーソリ処理の処理時間が長くなります。
受験上の注意ポイント
- 索引を増やせばSELECTは速くなるが、INSERT/UPDATE/DELETEは遅くなる というトレードオフを必ず意識する。
- 問題文で「INSERT時の挙動」や「ログ出力のタイミング・条件」を読み落とすと、「副次索引追加=一律改善」と誤解しやすい。
- RDBMSの仕様では、行挿入ごとに関連する全索引を更新し、変更ログを出力するため、索引追加は必ず負荷増の要因になる。
試験対策まとめ
- 索引のメリット/デメリット(検索高速化 vs. 更新遅延)を整理しておく。
- RDBMSのログ出力条件やデータ入出力方式(同期/非同期)の概念を押さえておく。
- 問題文で「INSERT」「UPDATE」「DELETE」の処理経路と、それに伴うI/O/CPU負荷の発生源を常に確認する。
設問2(1):〔“オーソリ履歴 ” テーブルの区分化〕 について,(1)〜(4)に答えよ。
課題1について, 案Aと案Bは案Cに比べてオーソリ処理の INSERT文の性能が良いと考えられる。その理由を25字以内で具体的に述べよ。
模範解答
挿入される行が複数の区分に分散するから
解説
1. コアキーワード・論点整理
- 「区分化」:テーブルを物理的な表領域に分割し,区分キーの値に基づいて行を分散配置する機能
- 案A/Bの区分キー:「カード番号」
- 案Cの区分キー:「利用日(1か月を1区分)」
- 課題1:オーソリ処理のINSERT文性能の低下改善
- 性能改善のポイント:挿入処理が集中する区分の分散化
2. 解答理由の論理展開
-
問題文より,区分化の効果として「テーブルを検索する SQL 文の WHERE 句の述語に区分キー列を指定すると,区分キー列で特定した区分だけを探索する」ことが示されています。「レンジは, 区分キー値の範囲によって区分に行を分配する方法である。」
「ハッシュは, 区分キー値を基に RDBMS が生成するハッシュ値によって一定数の区分に行を分配する方法である。」 -
案A/Bは「カード番号」を区分キーとしています。カード単位では乱数的に散らばるため,複数の区分にINSERT行が分散します。
-
一方,案Cは「利用日」で1か月を1区分としているため,オーソリ処理時の当月分INSERTは必ず同一区分に集中し,その区分の入出力やロックがボトルネックになります。
-
よって,「挿入される行が複数の区分に分散するから」が適切な理由です。
提案案の比較表
3. 受験上の注意・よくある誤答
- 「レンジだから分散しない」とだけ書くのは×
→ 案Cの特性は「利用日で1か月を1区分」にしている点が重要です。 - パーティション数やページ数の計算に引きずられて長文になると,字数制限(25字以内)を超えてしまいます。
- 「分散しているから」とだけの記載も不十分
→ 「挿入される行が複数の区分に分散する」と具体的に書くことがポイントです。
4. 試験対策ポイント
- 区分化(パーティショニング)の種類と特徴
- ハッシュ:キー値に応じて均等分散
- レンジ:値の範囲で分割
- INSERT性能を改善するには,ホットスポット(集中書き込み)が起きないよう区分キーを選ぶ
- 表探索/索引探索,同期/非同期入出力の特徴
- 設問字数制限に注意し,キーワードを漏らさず簡潔にまとめる
設問2(2):〔“オーソリ履歴 ” テーブルの区分化〕 について,(1)〜(4)に答えよ。
課題2について, 区分限定の表探索を行う場合, 1 ジョブが探索する区分数及びページ数の最小値はそれぞれ幾らか。 表2中の(イ)、(ロ)に入れる適切な数値を答えよ。
模範解答
イ:1
ロ:40,000,000
解説
模範解答の論点整理
- 区分化方式
- 案Cは「レンジ」による区分化で、区分キーは「利用日(1か月を1区分)」
- WHERE句による区分限定(パーティション・プルーニング)
- 図3のWHERE句中に「A.利用日 BETWEEN :hv1 AND :hv2」があるため、該当する1区分だけを探索
- ページ数の計算
- 「オーソリ履歴」テーブル全体のページ数は「24億」(表1より)
- 60区分に均等に分配 ⇒ 1区分あたりのページ数 = 24億 ÷ 60 = 0.4億 = 40,000,000ページ
解答の根拠
-
区分化の前提「いずれの案も 60 区分に行を均等に分配する前提であり、…」
(問題文より引用) -
案Cの区分化
-
WHERE句による区分限定図3
WHERE A.審査結果 = 'Y' AND A.利用日 BETWEEN :hv1 AND :hv2
AND A.カード番号 BETWEEN :hv3 AND :hv4 AND A.加盟店番号 = B.加盟店番号
(図3のWHERE句より引用)上記のように「利用日」によるBETWEEN句があるため、レンジ区分化された利用日列に対してパーティション・プルーニングが効き、該当月に対応する1区分のみを探索する。 -
1区分あたりのページ数計算
したがって、表2中の(イ)、(ロ)には次の数値が入ります。
- (イ):1
- (ロ):40,000,000
受験者が誤りやすいポイント
-
区分キーとWHERE句の整合性
- 案B(レンジ、区分キー:カード番号)は、WHERE句が「カード番号 BETWEEN …」だけなら区分限定が効くが、問題の図3ではWHERE句に「利用日 BETWEEN …」も含む。
- 区分キーに含まれない列で絞り込んでもパーティション・プルーニングは起きず、全60区分を探索してしまう。
-
ハッシュ区分ではレンジ指定による限定ができない
- 案A(ハッシュ、区分キー:カード番号)は、レンジ指定に対応しないため常に60区分全件走査になる。
-
ページ数の読み違え
- 「表1」にある「ページ数」は24億。これを見落として「480億」や「9,600万」と混同しないよう注意。
試験対策として覚えておくべきポイント
- パーティション(区分化)方式
- ハッシュ:特定の値による絞り込み(=)のみパーティション限定
- レンジ:範囲指定(BETWEEN/<,>)による絞り込みで限定
- パーティション・プルーニングの条件
- WHERE句に区分キー列の絞り込み条件が含まれていること
- 大量データのページ計算
- ページ数 = 全行数 ÷ 1ページ当たり行数
- 区分後の1区分あたりページ数 = 全体ページ数 ÷ 区分数
- 問題文の数値は正確に引用
- 「24億」「60区分」「利用日 BETWEEN :hv1 AND :hv2」など、原文に忠実に扱うこと。
設問2(3):〔“オーソリ履歴 ” テーブルの区分化〕 について,(1)〜(4)に答えよ。
課題2について, 案Aではカード番号に BETWEEN 述語を追加しても改善効果を得られないと考えられる。その理由を30字以内で具体的に述べよ。
模範解答
区分方法がハッシュでは探索する区分を限定できないから
解説
キーワードと論点
- ハッシュ区分化
- 探索区分の限定
- RANGE(レンジ) vs HASH(ハッシュ)
- パーティションプルーニング(区分プルーニング)
解答の理由
「案A」は ハッシュ による区分化を採用しています。
問題文より、
問題文より、
「ハッシュは, 区分キー値を基に RDBMS が生成するハッシュ値によって一定数の区分に行を分配する方法である。」
とあり、さらに
「SQL 文の WHERE 句の述語に区分キー列を指定すると, 区分キー列で特定した区分だけを探索する。」
とあります。
しかしハッシュ区分では、**区分キーに対する範囲検索(BETWEEN)**では各行のハッシュ値がどの区分に属するかを事前に特定できません。
したがって、カード番号に
したがって、カード番号に
BETWEEN
を追加しても、探索する区分を絞り込むことができず、全区分(60区分)を探索することになります。注意ポイント
- ハッシュ区分化は「等価条件(=)のみ」でプルーニング可能。
- **範囲検索(BETWEEN など)**で区分プルーニングできるのはレンジ区分化のみ。
- 「区分キー列に述語を指定すれば必ず区分のみ探索する」と誤解しない。
試験対策としてのまとめ
- ハッシュ区分化は等価検索向き、範囲検索ではプルーニングされず全区分を走査。
- レンジ区分化は範囲検索との相性がよく、BETWEEN によって不要区分を除外可能。
- パーティション(区分)化を設計する際は、想定する検索条件(等価なのか範囲なのか)をまず整理すること。
設問2(4):〔“オーソリ履歴 ” テーブルの区分化〕 について,(1)〜(4)に答えよ。
課題3 について, 特に案Cは, 区分キーの特徴から, 案Aと案Bに比べて再編成の効率が良いと考えられる。その理由を 20字以内で具体的に述べよ。
模範解答
1区分だけを再編成すれば良いから
解説
キーワード・論点整理
-
「区分化」:テーブルを区分キーの値に基づいて物理的に分割
-
「再編成」:テーブル又は区分を再編成することで,行を主キー順に物理的に並び替える(【RDBMS の主な仕様】1.(4))
-
案Cの区分方法と区分キー
-
模範解答キーワード:
「1区分だけを再編成すれば良いから」
解答解説
- 再編成の単位は「テーブル又は区分」(【RDBMS の主な仕様】1.(4))
- 案Cは「レンジ」による区分化で、**利用日をキーに「1か月を1区分」**とする
- そのため,ある月の再編成では当該月を格納する1つの区分だけを対象にできる
- 他案との比較
- 案A・Bはカード番号で区分化しており,どの区分にも全利用日のデータが分散
- したがって月初の再編成でも全区分を再編成しなければならず時間がかかる
- よって,「1区分だけを再編成すれば良いから」という解答になります
受験者が誤りやすいポイント
- 「区分化=全体を分割するだけ」と誤解し,再編成も全区分に同時適用されると思い込む
- ハッシュ/レンジの違いを押さえず,カード番号レンジでも月別に区分できると勘違い
- 再編成はあくまで区分単位で実行可能である点を忘れない
覚えておくべき試験対策ポイント
- パーティション(区分化)はレイアウト(ハッシュ/レンジ)によってデータ配置の偏在性が変わる
- レンジ区分は連続した範囲に属するデータをまとめるため,期間単位のメンテナンスに有利
- 再編成(オーガナイズ)はパーティション単位に実行でき,必要最小限の処理範囲で性能改善が図れる
- 問題文の仕様番号(例:1.(3)ハッシュ/レンジ,1.(4)再編成)を指示通りに引用し説明すると説得力が高まる
設問3(1):〔更新処理の多重化〕について,(1),(2)に答えよ。
ジョブの多重度を幾ら増やしても,それ以上は更新処理全体の処理時間を短くできない限界がある。このときボトルネックになるのはログである。その理由を RDBMS の仕様に基づいて30字以内で述べよ。
模範解答
・コミットはログ出力処理の完了まで待たされるから
・ログ出力処理は並列化されないから
・ログ出力処理は逐次化されるから
・ログバッファが一杯だと更新が待たされるから
解説
模範解答のキーワード整理
- コミット待ち:トランザクションのコミットは「ログ出力処理の完了まで待たされる」
- 逐次化(非並列化):ログ出力は一つのログバッファ/一つのディスクに順次書き込まれる
- ログバッファ制約:ログバッファが一杯だと各更新処理が待機
解答の論理的説明
問題の更新処理を多重化しても高速化に限界があるのは,すべてのトランザクションが共通のログ出力処理という単一の直列化された作業を待つためです。
以下,RDBMS の仕様から引用しながら説明します。
以下,RDBMS の仕様から引用しながら説明します。
- 「ログバッファが一杯の場合, トランザクショインの INSERT文 UPDATE 文, DELETE 文の処理は待たされる」
→ 更新処理がログバッファ空き待ちでブロックされる可能性があります。 - 「トランザクションのコミットはログ出力処理の完了まで待たされる」
→ コミットを行った瞬間,ログのディスク出力が終わるまで他の処理は先に進めません。 - ログ出力は単一のログバッファから一つのディスクへ,トリガー事象ごとに 逐次 行われ,並列化されない
これらにより,いくらジョブ数を増やして同時更新を試みても,最後にはログ出力という一本の“くびき”が待ち受け,そこがボトルネックになります。
受験者が誤りやすいポイント
- 「ディスクI/O」や「CPU処理」をボトルネックに考えがちですが,更新処理ではログ出力が先行して行われ,しかも並列化できない点が重要です。
- 「データバッファ競合」ではなく,「ログバッファ/ログ出力」が競合ポイントであることを押さえましょう。
試験対策として覚えておくべきポイント
- トランザクション処理では,WAL(Write Ahead Logging) の仕組みから,変更ページより先にログをディスクに書き出す
- コミット待ち=ログ出力完了待ちになるため,ログI/O性能が全体性能を制限する
- ログ出力は逐次処理のため,並列化してもスループットは頭打ちになる
- ログバッファサイズ,ログデバイスのI/O性能,グループコミットなどの対策を理解しておくこと
設問3(2):〔更新処理の多重化〕について,(1),(2)に答えよ。
更新処理では 1,000 行更新するごとにコミットしているが, 仮に1行更新するごとにコミットすると,更新処理の処理時間のうち何がどのように変わるか。本文中の用語を用いて 25字以内で述べよ。
模範解答
・ログ出力処理の待ち時間の合計が長くなる。
・コミット時の待ち時間の合計が長くなる。
解説
模範解答のキーワードと論点整理
- ログ出力処理
- コミット時の待ち時間
- 待ち時間の合計が長くなる
これらが「何が」「どのように変わるか」の核心です。
解答解説
問題文中には次のように記述されています。
「ログは, データより先にログバッファからディスクに出力される。これをログ出力処理と呼ぶ。…トランザクションのコミットはログ出力処理の完了まで待たされる。」
「ログ出力処理は…② トランザクションがコミット又はロールバックを行った。を契機に行われる。」
通常「1,000行更新ごとにコミット」している場合、まとめて1回だけログ出力処理が走り、その待ち時間が1回分だけ発生します。
しかし「1行更新するごとにコミット」すると、更新行数分だけ(たとえば1000倍)ログ出力処理が発生し、コミット時に毎回待たされるため、
しかし「1行更新するごとにコミット」すると、更新行数分だけ(たとえば1000倍)ログ出力処理が発生し、コミット時に毎回待たされるため、
- 1回あたりのログ出力処理時間 × コミット回数
が増大し、**「ログ出力処理の待ち時間の合計」および「コミット時の待ち時間の合計」**が長くなります。
受験者が誤りやすいポイント
- 「データ入出力」の待ち時間と混同しやすい
→ 本問はログ出力処理(ログバッファ→ディスク)の待ち時間が増える話です。 - 「コミット=データバッファのフラッシュ」と考えがち
→ コミット時に必ず実行されるのはログ出力処理であり、データバッファの書き込み(再編成やチェックポイント)は別タイミングです。
試験対策として覚えておくポイント
- コミット時には必ず「ログ出力処理」が走り、その完了を待ってから次に進む(同期処理)。
- コミット頻度を上げるとログ出力回数が増え、待ち時間の合計が大きくなる。
- バッチ更新では、まとめコミット(バルクコミット)で性能向上を図る。