ホーム > データベーススペシャリスト試験 > 2011年
データベーススペシャリスト試験 2011年 午後1 問03
関係データベースの性能に関する次の記述を読んで, 設問1〜3に答えよ。
クレジットカード会社のC社では、カード決済の検査機能を強化することになった。C社で使用しているテーブルは大規模であり, 情報システム部のFさんが関係データベース管理システム (RDBMS) の SQL文の性能測定を実施することになった。
〔RDBMS の主な仕様〕
RDBMS の物理構造とアクセス経路に関する主な仕様は,次のとおりである。
1.テーブルの行は, データページに格納される。 異なるテーブルの行が,同じデータページに格納されることはない。 また, 1 行が異なるデータページに格納されることはない。
2.索引には,ユニーク索引と非ユニーク索引がある。 ユニーク索引のキーは1行だけを指すのに対し,非ユニーク索引のキーは1行以上の行を指す。
3.索引には,クラスタ索引と非クラスタ索引がある。 キー値の順番と、キーが指す行の物理的な並び順が一致している場合をクラスタ索引と呼び, ランダムな場合を非クラスタ索引と呼ぶ。
4.アクセス経路は, RDBMS によって表探索又は索引探索に決められる。 表探索では索引を使わずに先頭データページから全行を探索し,索引探索では WHERE 句中の述語に適した索引によって絞り込んでからデータページ中の行を読み込む。 SQL 文の実行によって得られる行を, 結果行と呼ぶ。
5.索引探索に使える述語は,次のとおりである。 ここで,比較演算子は =,<, >,<=, >= のいずれかである。
(1) 列名 比較演算子 比較値
(2) 列名 BETWEEN 比較値 AND 比較値
(1) 列名 比較演算子 比較値
(2) 列名 BETWEEN 比較値 AND 比較値
RDBMS のデータ入出力処理とログ出力処理に関する仕様は,次のとおりである。
1.データ入出力処理とログ出力処理は, 4,096 バイトのページ単位に行われる。
2.データ入出力処理において,磁気ディスク装置(以下,ディスクという)に対してデータページをランダムに入出力する場合, SQL 処理中の CPU 処理とデータ入出力処理は並行して行われない。この場合のデータ入出力処理を同期データ入出力処理と呼び, SQL 処理時間は次の式で近似できる。
SQL処理時間 = CPU 処理時間 + 同期データ入出力処理時間
3.データ入出力処理において, ディスクに対してデータページを順次に入出力する場合, SQL 処理中の CPU 処理とデータ入出力処理は並行して行われる。この場合のデータ入出力処理を非同期データ入出力処理と呼び, SQL 処理時間は次の式で近似できる。ここで,関数 MAX は, 引数のうち, 大きい方の値を返す。
SQL処理時間 = MAX (CPU処理時間, 非同期データ入出力処理時間)
4.テーブルごとに確保されたデータバッファが,変更データページによって一杯になった場合,データバッファの内容がディスクに出力される。
5.UPDATE 文によって行を変更した場合,変更前後の行全体がシステムによる回復用ログとしてログページに書き込まれ, システムに1個存在するログバッファに蓄えられる。次の事象 A〜C のいずれかが発生したとき,ログ先行出力機能によって,ログページはデータページよりも先にディスクに出力される。
事象A トランザクションが、コミットかロールバックを行った。
事象B ログバッファが,ログページによって一杯になった。
事象C データバッファが, 変更データページによって一杯になった。
6.同じディスクに対して,同時に入出力を行うことはない。 また, データページが格納されているディスクとログページが格納されているディスクの間で競合は起きない。
7.データバッファとログバッファの大きさは,ともに2,000ページである。
〔測定用テーブルとその索引の設計 〕
測定用テーブルとして,行長が異なる2個のテーブル, “TA” と “TB” を用意した。測定用テーブルについて, その大きさを表1に, 列値の範囲と分布を表2に、索引の設計を表3に示す。



〔測定用 SQL文の仕様と構文〕
測定用 SQL文について, その仕様を表4に, 構文を表5に示す。


〔SELECT文の処理時間の測定〕
SELECT 文の処理時間の一部を表6に示す。 測定では,索引ページはすべてバッファヒットさせ,SELECT文の結果行は外部ファイルに出力していない。

Fさんは,表6のSELECT文の処理時間について次のように分析した。
分析A
SQL1AとSQL2A のデータ入出力処理は,(f) データ入出力処理である。
データ入力処理時間は,(g)秒である。 全データページを順次にデータバッファに入力するのに必要な CPU 処理時間は 10 秒であるから, 全行をデータバッファからプログラム内に移動するのに必要な CPU 処理時間は, (h)秒である。SQL1A に述語 C4<:hv を指定する WHERE 句を追加して結果行を減らせば,SQL 処理時間は短くなるが,(i)行以下に減らしても(j)秒より短くはならない。 表探索によって “TA” テープルからN個の結果行を得るのに必要なSQL 処理時間 T1 は、 次の実験式で表せる。
T1 = MAX(10秒 + 0.1 ミリ秒行 × N行, 1ミリ秒/ページ × (k) ページ)
分析 B
SQL3A のデータ入出力処理は,(l)データ入出力処理である。 最大で(m) ページをランダムに入力したときのデータ入力処理時間は, 10 秒である。 非クラスタ索引探索によって, "TA” テーブルからN個の結果を得るのに必要な SQL 処理時間 T2 は、 次の実験式で表せる。 ただし, N は 1,000 以下とし, また, データページはバッファヒットしないものとする。
T2 = 0.1ミリ秒行 × N行 + 10 ミリ秒ページ × (n)ページ
〔UPDATE文の処理時間の測定〕
Fさんの上司であるG氏から、 UPDATE 文の処理時間の測定に対して次のような要望があった。
要望① UPDATE 文を含むトランザクションを並行して実行するとデッドロックが起きる場合がある。 デッドロックを意図的に起こさせる試験を追加してほしい。
要望② テーブルの全行更新処理が予想される。 テーブルを区分に物理分割した場合を検討し,ログ出力処理時間を考慮したSQL 処理時間を推定してほしい。
Fさんは,まず SQL6x を測定し, クラスタ索引探索によってN行を更新する場合のSQL 処理時間 T3 を推定する実験式を考えた。 ここで, データページの1ページ中の
全行を更新するごとにログページが2ページ出力されるものとする。
T3 = MAX(0.2ミリ秒/行 × N行, 1ミリ秒/ページ × 入出力データページ数)+1ミリ秒/ページ× 出力ログページ数
次に, “TA” テーブルと “TB” テーブルをそれぞれ次のように区分に物理分割し、処理時間を短縮するために区分別の UPDATE 文を並行して実行させることを考えた。
1.C3 列を区分キーとして, テーブルを四つの区分に物理分割する。
2.データ入出力処理が競合しないように、各区分を異なるディスクに配置する。
3.索引の TAX3 と TBX3 がクラスタ索引になるように, 各テーブルの行を並べ替える。
4.ホスト変数に区分キーのいずれかの値を指定した四つのSQL7x を区分別に作成する。SQL7x は,それぞれ該当区分の全行を更新する。
5.UPDATE 文は,カーソルを使用し, 1,000行を更新するごとにコミットする。
そして, "TA” テーブルと “TB” テーブルを物理分割せずに全行更新する場合と,物理分割した上で, 1 区分だけを全行更新する場合と、 全区分を並行して全行更新する場合の各UPDATE 文の処理時間を, 実験式を用いて推定し, 表7に示した。

設問1
〔測定用 SQL文の仕様と構文〕 における SQL 文について,表5の SQL 文中の(a)〜(e)に入れる適切な字句を答えよ。
模範解答
a:1
b:C2 BETWEEN 1 AND 1000
c:C3,C4,SUM(C5)
d:C3,C4
e:COUNT(*) > =10
解説
模範解答の核心となるキーワードや論点
以下のように,(a)~(e) の空欄それぞれは,SQL 文の仕様やテーブル・索引設計の要件から決まります。
解答になる理由を問題文の記述を引用しながら論理的に説明
-
(a) SQL2A の「WHERE C4 < a」
問題文「SQL2x … 結果行はない。」という要件を満たすには,C4 の最小値未満を指定します。
表2 によると「C4 列は 1〜1,000 のいずれかの整数。各列値に同数の行が存在する。」ため,C4 < 1
とすれば該当行はゼロ件になります。
→ a:1 -
(b) SQL3A の「WHERE b」
問題文「SQL3x … 非クラスタ索引探索によって、1,000行の結果行を得る。述語は1個。」
表3 によると,TA テーブルの非クラスタ索引にはTAX2(列名 C2,ユニーク)
とTAX3(列名 C3,非ユニーク)
があります。TAX3
は非ユニークだが,C3 = 定数
では行数が 1/4 にあたる ≒ 5,000,000 行取得されてしまう。TAX2
はユニーク索引ながら,範囲検索BETWEEN
を使えば複数行を得られます。C2 は 1~20,000,000 の一意な整数。
ここでC2 BETWEEN 1 AND 1000
とすればちょうど 1,000 行を取得できます。
→ b:C2 BETWEEN 1 AND 1000
-
(c)/(d)/(e) SQL4A の「SELECT c FROM TA GROUP BY d HAVING e」
問題文「SQL4x … C3列とC4列を組み合わせたグループごとにC5列の合計値を求める。ただし、対象となるのは、グループの行数が10以上のグループだけである。」- SELECT 句には集約対象の列 C5 の合計と,グループ化のキー C3,C4 を含める必要があります。
- GROUP BY 句にはグループ化キーを列挙します。
- HAVING 句で「グループの行数が10以上」の条件は
COUNT(*)>=10
で表します。
→ c:C3,C4,SUM(C5)
→ d:C3,C4
→ e:COUNT(*)>=10
受験者が誤りやすいポイント・ひっかけ
-
【SQL2A の a】
- 「C4 列に索引はない」ため,どんな値でも表探索になることを忘れ,索引探索できると思い込みがちです。
C4<0
としても正解ですが,最小値「1」を意識せずに「0」や「–1」を書くと,問題文に記載のない値を持ち出すことになり不適切です。
-
【SQL3A の b】
- 範囲検索をすべての列に当てはめてしまい,C3 や C1 に
BETWEEN
を使おうとする誤り。C3 列は非ユニークで=
検索のみ意味があり,1,000行を得られません。 - 索引のクラスタ/非クラスタの違いを混同し,「クラスタ索引だから高速」とだけ考え,
TAX1(C1 のクラスタ索引)
を使おうとしても,=定数
では 1 行しか得られません。
- 範囲検索をすべての列に当てはめてしまい,C3 や C1 に
-
【SQL4A の c/d/e】
HAVING
句とWHERE
句を混同し,集約後のフィルタをWHERE COUNT(*)>=10
と書いてしまう。COUNT(C5)>=10
と間違えると,NULL 扱いの影響で意図と異なる結果になります。本問では C5 に NULL はない前提ですが,試験ではCOUNT(*)
が最適です。
試験対策として覚えておくべきポイント
-
索引の種類と探索方法
- 非クラスタ索引は,キー順とデータの物理順が異なる。範囲検索(BETWEEN/<,>,<=,>=)での利用を想定する。
- クラスタ索引は物理順と一致するが,1:1 またはユニークな検索に向く。
-
SQL 文法
WHERE
はグループ化前の行フィルタ,用いるのは非集約列に対する条件。GROUP BY
で指定した列+集約関数のみSELECT
できる。HAVING
はグループ化後の行フィルタ,用いるのは集約結果に対する条件。
-
BETWEEN の仕様
A BETWEEN x AND y
はA>=x AND A<=y
と同義。
-
問題文の要件を正確に読む
- 「結果行はない」「1,000行の結果行を得る」など,行数要件から逆算して定数や範囲を決める。
- 列値の分布や索引設計を表から正確に読み取り,利用可能な索引を把握する。
設問2
〔SELECT文の処理時間の測定〕 におけるFさんの分析 A と分析 Bについて,本文中の(f)〜(n)に入れる適切な字句を答えよ。
模範解答
f:非同期
g:1,000
h:2,000
i:9,900,000
j:1,000
k:1,000,000
l:同期
m:1,000
n:N
解説
1. キーワードと論点の整理
まず,本問で押さえるべき主要なポイントは以下のとおりです。
2. f~n の解答と解説
分析 A の空欄
(f)「非同期」
問題文中に,「ディスクに対してデータページを順次に入出力する場合,SQL 処理中の CPU 処理とデータ入出力処理は並行して行われる.この場合のデータ入出力処理を非同期データ入出力処理と呼び…」とあるため。
問題文中に,「ディスクに対してデータページを順次に入出力する場合,SQL 処理中の CPU 処理とデータ入出力処理は並行して行われる.この場合のデータ入出力処理を非同期データ入出力処理と呼び…」とあるため。
(g)「1,000」
非同期データ入出力処理の I/O 時間は「1ミリ秒/ページ」であり,TA は「全データページ数 1,000,000 ページ」(表1)なので,
1,000,000 ページ × 1 ミリ秒/ページ = 1,000 秒。
非同期データ入出力処理の I/O 時間は「1ミリ秒/ページ」であり,TA は「全データページ数 1,000,000 ページ」(表1)なので,
1,000,000 ページ × 1 ミリ秒/ページ = 1,000 秒。
(h)「2,000」
「全データページを順次にデータバッファに入力するのに必要な CPU 処理時間は10秒」とある。
SQL1A の CPU 全体処理時間は2,010秒(表6)。
よって「全行をデータバッファからプログラム内に移動するのに必要な CPU 処理時間」は
2,010秒 – 10秒 = 2,000秒。
「全データページを順次にデータバッファに入力するのに必要な CPU 処理時間は10秒」とある。
SQL1A の CPU 全体処理時間は2,010秒(表6)。
よって「全行をデータバッファからプログラム内に移動するのに必要な CPU 処理時間」は
2,010秒 – 10秒 = 2,000秒。
(i)「9,900,000」
T1 = MAX(10秒 + 0.1ミリ秒×N行, 1,000秒) なので,
10秒 + 0.1ミリ秒×N行 ≦ 1,000秒 となる境界 N を求める:
0.0001秒 × N ≦ 990秒 → N ≦ 9,900,000 行。
T1 = MAX(10秒 + 0.1ミリ秒×N行, 1,000秒) なので,
10秒 + 0.1ミリ秒×N行 ≦ 1,000秒 となる境界 N を求める:
0.0001秒 × N ≦ 990秒 → N ≦ 9,900,000 行。
(j)「1,000」
T1 の第二項 1,000秒は,I/O 時間(1ミリ秒/ページ × 1,000,000ページ)に相当し,
結果行を減らしても I/O は全ページ走査のままなので,これ以下にはならない。
T1 の第二項 1,000秒は,I/O 時間(1ミリ秒/ページ × 1,000,000ページ)に相当し,
結果行を減らしても I/O は全ページ走査のままなので,これ以下にはならない。
(k)「1,000,000」
TA テーブルの「全データページ数」は 1,000,000 ページ(表1)。
TA テーブルの「全データページ数」は 1,000,000 ページ(表1)。
分析 B の空欄
(l)「同期」
ランダムにディスク I/O を行う場合,「同期データ入出力処理」と呼ぶ(問題文の仕様2)。
ランダムにディスク I/O を行う場合,「同期データ入出力処理」と呼ぶ(問題文の仕様2)。
(m)「1,000」
「最大で(m)ページをランダムに入力したときのデータ入力処理時間は10秒」とあり,
10秒 ÷ 10ミリ秒/ページ = 1,000 ページ。
「最大で(m)ページをランダムに入力したときのデータ入力処理時間は10秒」とあり,
10秒 ÷ 10ミリ秒/ページ = 1,000 ページ。
(n)「N」
非クラスタ索引探索で得られる結果行数 N に対応して,ランダム I/O するデータページ数も最大 N ページとなるため。
非クラスタ索引探索で得られる結果行数 N に対応して,ランダム I/O するデータページ数も最大 N ページとなるため。
3. 受験者が誤りやすいポイント
- 「同期」「非同期」の区別:
順次読み込みで並行可能なのが「非同期」,ランダム読み込みで並行不可なのが「同期」です。 - 単位の扱い:
ミリ秒と秒の変換(1ミリ秒 = 0.001秒)を忘れると,g, i の計算で誤りやすいです。 - ページ数と行数を混同しない:
表探索の I/O はページ数ベース,一行あたりの CPU 処理は行数ベースで時間を計算します。
4. 試験対策まとめ
- I/O モードの理解:
順次/ランダムアクセスで「非同期/同期データ入出力処理」と名称も性能式も変わる。 - 性能式の構造把握:
SELECT 文は CPU 時間と I/O 時間のうち大きい方を取る(非同期時),もしくは両者の和(同期時)。 - 具体数値演算:
問題文中の「1ミリ秒/ページ」「10ミリ秒/ページ」「0.1ミリ秒/行」などを用いた時間計算に慣れる。 - テーブル定義の把握:
ページ当たり行数,総ページ数,インデックスのクラスタ/非クラスタ性が処理時間に影響する。
設問3(1):〔UPDATE文の処理時間の測定〕におけるG氏の要望について、(1)~(3)に答えよ。
要望 ①に対応するために, F さんは SQL5Aとデッドロックが起きる可能性がある UPDATE 文の例を次のように作成した。 このSQL 文中の(ア)に入れる適切な字句を答えよ。また,このときにデッドロックが起きる理由を、35字以内で述べよ。 ここで, WHERE 句の述語 1個だけで 1,000 行を更新し、かつ, アクセス経路は索引探索に限るものとする。
UPDATE TA SET C5 = C5 + 1 WHERE (ア)
模範解答
ア:C2 BETWEEN 1 AND 1000
理由:・アクセス経路によって行を更新する順番が異なるから
・索引 TAX1と索引 TAX2とでは行を更新する順番が異なるから
解説
キーワードと論点の整理
- デッドロック
複数トランザクションが互いに相手が保持するロックを待ち合う状態 - 索引探索とクラスタ/非クラスタ索引
「表探索ではなく,WHERE句の索引によって絞り込む」(問題文より)- TAX1:
C1
列に対するユニーク・クラスタ索引 - TAX2:
C2
列に対するユニーク・非クラスタ索引
- TAX1:
- ロック取得順序の不一致
- クラスタ索引探索 →
C1
の昇順で行ロックを取得 - 非クラスタ索引探索 →
C2
の昇順で行ロックを取得
→ 順序が異なるため,循環待ち(デッドロック)を招く
- クラスタ索引探索 →
解答の根拠と論理展開
-
【問題文】より
「アクセス経路は索引探索に限るものとする」「WHERE句の述語1個だけで1,000行を更新」
→ BETWEEN 1 AND 1000 のような範囲指定にすると,ユニーク索引を用いた索引探索でちょうど1,000行を更新できる -
索引設計(表3)より
WHERE C1 BETWEEN 1 AND 1000
→ TAX1を使い,C1昇順でロックWHERE C2 BETWEEN 1 AND 1000
→ TAX2を使い,C2昇順でロック
-
トランザクションを並行実行すると,
- TX1:
UPDATE … WHERE C1 BETWEEN 1 AND 1000
→ C1 の昇順に行ロックを取得 - TX2:
UPDATE … WHERE C2 BETWEEN 1 AND 1000
→ C2 の昇順に行ロックを取得
両者が同じ行群を更新対象とすると,ロック取得の順序が逆転して「TX1がある行のロックを待ち,TX2が別の行のロックを待つ」という循環待ちが発生し,デッドロックとなる。 - TX1:
模範解答
ア:C2 BETWEEN 1 AND 1000
理由:索引 TAX1 と TAX2 とでは行を更新する順番が異なるから
受験者が誤りやすいポイント
- 「クラスタ索引」と「非クラスタ索引」でロック順序が同じならデッドロックは起きない
=
演算子で 1 行だけを更新するとデッドロックを起こしにくい- 範囲条件は
BETWEEN
でなければ索引が利用されない場合がある
試験対策ポイント
- デッドロックの本質:ロック取得順序の不一致による循環待ち
- クラスタ索引 vs 非クラスタ索引
- クラスタ索引:物理順序とキー順序が一致
- 非クラスタ索引:物理順序はランダム
- 索引探索の条件
- 比較演算子(=,<,>,<=,>=)または BETWEEN を用い,列を明示
- ユニーク索引/非ユニーク索引の特性を把握
- 並行更新試験
- 異なるアクセス経路を使う更新 SQL を複数用意し,意図的にデッドロックを検証する
- ロック粒度
- 本試験では「行単位ロック」「READ COMMITTED」と明記されているので,行レベルでの競合を想定すること
設問3(2):〔UPDATE文の処理時間の測定〕におけるG氏の要望について、(1)~(3)に答えよ。
要望②に対応するために推定した表7中の(o)〜(q)に入れる適切な字句を答えよ。
模範解答
o:2,000
p:500
q:2,000
解説
模範解答のキーワード・論点整理
- 更新対象行数(N行)の算出
・TA:20 000 000行÷4区分=5 000 000行/区分
・TB: 2 000 000行÷4区分= 500 000行/区分 - 行数→データページ数の変換(表 1 より「1ページ当たりの行数」を引用)
- データ入出力処理時間の算出
RDBMS仕様:「データ入出力処理は,4 096バイトのページ単位」「順次入出力時は CPU 処理と並行」「1 ミリ秒/ページ」
更新では「読み込み+書き込み」で 1 ページ当たり 2 ミリ秒 ⇒
250 000ページ×2 ミリ秒=500 000ミリ秒=500秒 - ログ出力処理時間の算出
問題文:「データページの1ページ中の全行を更新するごとにログページが2ページ出力されるものとする。」
1区分あたりのログページ数:250 000ページ×2=500 000ページ
1ミリ秒/ページ×500 000ページ=500秒 - 並行数 4 のときのログ出力の直列化
RDBMS仕様:「同じディスクに対して,同時に入出力を行うことはない。」
ログは1つのディスクに格納され,4ジョブが同時発生すると排他で直列化 ⇒
合計ログページ数=500 000ページ×4=2 000 000ページ
合計ログ出力時間=2 000 000ミリ秒=2 000秒
以上より,表 7 中(o)~(q)は次のとおりです。
- o(TA のログ出力処理時間):2 000
- p(TB のデータ入出力処理時間): 500
- q(TB のログ出力処理時間):2 000
解答導出の論理的ステップ
-
区分あたりの更新行数
問題文より「テーブルを四つの区分に物理分割する。」
「C3列を区分キーとして,テーブルを四つの区分に物理分割する。」
TA 全行 20,000,000行 ÷4 = 5,000,000行/区分
TB 全行 2,000,000行 ÷4 = 500,000行/区分 -
ページ数の計算
表 1「1ページ当たりの行数」を引用して- TA:行長200バイト ⇒ 1ページ当たり 20行 ⇒ 5,000,000÷20=250,000ページ
- TB:行長2,000バイト ⇒ 1ページ当たり 2行 ⇒ 500,000÷2 =250,000ページ
-
データ入出力処理時間
RDBMS 仕様より「データ入出力処理において,ディスクに対してデータページを順次に入出力する場合…1ミリ秒/ページ」
更新では「読み込み+書き込み」なので 1ページあたり2ミリ秒
250,000ページ×2ミリ秒=500,000ミリ秒=500秒
→ p = 500 -
ログ出力処理時間(単体ジョブ)
問題文より「データページの1ページ中の全行を更新するごとにログページが2ページ出力されるものとする。」
250,000データページ×2=500,000ログページ
1ミリ秒/ページ×500,000ページ=500秒 -
並行4ジョブ時のログ直列化
RDBMS 仕様より「同じディスクに対して,同時に入出力を行うことはない。」
4ジョブ分のログページ合計=500,000×4=2,000,000ページ
ログ出力時間=2,000,000ミリ秒=2,000秒
→ o = 2,000, q = 2,000
受験者が陥りやすいポイント
- 「1ページあたりの読み込み時間」にのみ注目して読み込み500秒、書き込みも500秒で合計1,000秒と誤算する。
→ 更新では「読み込み+書き込み」で 1ページあたり 2ミリ秒 になることを忘れずに。 - 並行実行時の ログ出力は直列化 される点を見落とし、単体ジョブの 500秒のままとしてしまう。
- TB は「1ページ当たりの行数が 2 行」と TA と異なる点を混同する。
試験対策ポイント
- 行数→ページ数変換には,「行長」や「1ページ当たりの行数」 を必ず確認する。
- データ入出力:読み込み・書き込み両方 の時間を足す場合がある。
- ログ出力:1ページの更新で何ページのログ出力が発生するか 問題文を正確に読み取る。
- 並行処理の制約:同じディスク上での入出力は直列化,別ディスク配置の有無もチェックする。
- 実験式(T3)における MAX や加算の意味を正しく理解し,各要素の単位が揃っているかも確認する。
設問3(3):〔UPDATE文の処理時間の測定〕におけるG氏の要望について、(1)~(3)に答えよ。
SQL6A を実行したとき,ログ先行出力機能の動作条件である事象 A〜Cのうち,発生しない事象がある。 発生しない事象を記号で答え、 その理由を本文中の用語を用いて, 25字以内で述べよ。 ここで,ほかに実行中の更新処理はないものとする。
模範解答
記号:B 又は C
理由:
記号を Bと解答した場合
・高々1,000行を更新してコミットするから
・ログバッファが一杯になる前にコミットするから
記号を Cと解答した場合
・高々1,000行を更新してコミットするから
・データバッファが一杯になる前にコミットするから
解説
1. キーワード整理
-
ログ先行出力の事象A~C
- A:トランザクションが,コミットかロールバックを行った。
- B:ログバッファが,ログページによって一杯になった。
- C:データバッファが,変更データページによって一杯になった。
-
SQL6A の仕様UPDATE TA SET C5 = C5 + 1 WHERE C1 BETWEEN 1 AND :hv
(SQL5xと同様に,更新後にCOMMITを実行) -
バッファ容量
-
TAテーブルの構成
-
ログ出力量データページの1ページ中の全行を更新するごとにログページが2ページ出力される。
2. 解答の論拠
SQL6Aでは「高々1,000行を更新してコミットする」ため,1つのトランザクションで更新されるデータページ数とログページ数は次のとおりです。
- 更新行数 N ≤ 1,000
- データページ数 ≒ ⌈N÷20⌉ ≤ ⌈1,000÷20⌉ = 50 ページ
- ログページ数 = 更新データページ数 × 2 ≤ 50 × 2 = 100 ページ
これとバッファ容量を比較すると:
- 事象B(ログバッファが一杯)
→ ログページは100ページしか出力せず,ログバッファ(2,000ページ)を超えない。 - 事象C(データバッファが一杯)
→ 変更データページは50ページしかなく,データバッファ(2,000ページ)を超えない。
一方,事象A(コミット)はSQL6A実行時に必ず発生します。
したがって,発生しない事象はBまたはCです。
したがって,発生しない事象はBまたはCです。
記号の例と理由(25字以内)
記号:B
理由:
記号:B
理由:
ログバッファが満たされる前にコミットするから
(Cを選ぶ場合は「データバッファが満たされる前にコミットするから」)
3. 注意点・ひっかけ
- コミット頻度の確認
SQL6Aは更新後に必ずCOMMITしているため,事象Aは必ず発生します。 - バッファの単位
「ページ数」で管理される点を押さえ,「バイト」換算しないよう注意。 - クラスタ索引による連続更新
TAはC1にクラスタ索引を持つため,更新対象行は物理的に連続したページに存在し,
各ページで全行更新→ログ出力量の計算が容易になります。
4. 試験対策ポイント
- ログ先行出力の発生条件A~Cを確実に暗記する。
- バッファサイズと1トランザクションでの更新量を比較し,
「バッファがあふれるかどうか」を判断できるようにする。 - UPDATE~COMMITの流れと,**コミット時の処理(事象A)**を押さえる。
- **索引の種類(クラスタ/非クラスタ)**が性能にどう影響するか,演習問題で慣れておく。