戦国IT - 情報処理技術者試験の過去問対策サイト
お知らせお問い合わせ料金プラン

データベーススペシャリスト 2011年 午後103


関係データベースの性能に関する次の記述を読んで、設問1〜3に答えよ。

 クレジットカード会社のC社では、カード決済の検査機能を強化することになった。C社で使用しているテーブルは大規模であり、情報システム部のFさんが関係データベース管理システム (RDBMS) の SQL文の性能測定を実施することになった。  
〔RDBMS の主な仕様〕  RDBMS の物理構造とアクセス経路に関する主な仕様は、次のとおりである。
1.テーブルの行は、データページに格納される。 異なるテーブルの行が、同じデータページに格納されることはない。 また、1 行が異なるデータページに格納されることはない。 2.索引には、ユニーク索引と非ユニーク索引がある。 ユニーク索引のキーは1行だけを指すのに対し、非ユニーク索引のキーは1行以上の行を指す。 3.索引には、クラスタ索引と非クラスタ索引がある。 キー値の順番と、キーが指す行の物理的な並び順が一致している場合をクラスタ索引と呼び、ランダムな場合を非クラスタ索引と呼ぶ。 4.アクセス経路は、RDBMS によって表探索又は索引探索に決められる。 表探索では索引を使わずに先頭データページから全行を探索し、索引探索では WHERE 句中の述語に適した索引によって絞り込んでからデータページ中の行を読み込む。 SQL 文の実行によって得られる行を、結果行と呼ぶ。 5.索引探索に使える述語は、次のとおりである。 ここで、比較演算子は =、<、>、<=、>= のいずれかである。
 (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に示す。
データベーススペシャリスト試験(平成23年 午後1 問3 表1)
データベーススペシャリスト試験(平成23年 午後1 問3 表2)
データベーススペシャリスト試験(平成23年 午後1 問3 表3)
〔測定用 SQL文の仕様と構文〕 測定用 SQL文について、その仕様を表4に、構文を表5に示す。
データベーススペシャリスト試験(平成23年 午後1 問3 表4)
データベーススペシャリスト試験(平成23年 午後1 問3 表5)
〔SELECT文の処理時間の測定〕 SELECT 文の処理時間の一部を表6に示す。 測定では、索引ページはすべてバッファヒットさせ,SELECT文の結果行は外部ファイルに出力していない。
データベーススペシャリスト試験(平成23年 午後1 問3 表6)
 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に示した。
データベーススペシャリスト試験(平成23年 午後1 問3 表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

解説

解答の論理構成

  1. (a) の決定
    • 【問題文】「SQL2x 結果行はない。」
    • 【問題文】「C4 列…1〜1,000 のいずれかの整数。」
    • WHERE 句「C4 < (a)」で全行不該当とするには最小値未満、すなわち 1 未満が条件。比較演算子は “<” のため (a)=1 とすれば C4 はすべて 1 以上で不一致となる。
  2. (b) の決定
    • 【問題文】「SQL3x 非クラスタ索引探索…1,000行の結果行を得る。述語は1個。」
    • 【問題文】「TAX2…列名 C2/ユニーク索引/非クラスタ索引。」
    • C2 は「1〜2,000 万のそれぞれ重複がない整数」。よって BETWEEN 1 AND 1000 でピタリ 1,000 行。述語パターンは “列名 BETWEEN 値 AND 値” が索引利用可。
  3. (c) と (d) の決定
    • 【問題文】「SQL4x C3列とC4列を組み合わせたグループごとにC5列の合計値を求める。」
    • SELECT 句にはグループ化列+集計関数を並べる必要があるため “C3,C4,SUM(C5)”。
    • GROUP BY 句はグループ化対象を列挙するだけなので “C3,C4”。
  4. (e) の決定
    • 同仕様文末「対象となるのは、グループの行数が10以上のグループだけ」。
    • 集合関数 COUNT() で行数を算出し、条件 COUNT()>=10 を HAVING 句に置く。

誤りやすいポイント

  • (a) を 0 として “C4<0” と書くと範囲外数値を指定しただけになり、試験では 0 が適切値かどうかの根拠が弱く減点されがち。
  • (b) で “C3 = 1” などを選ぶと 5,000,000 行となり仕様「1,000行」を逸脱。
  • SELECT 句と GROUP BY 句の列対応を忘れ “SUM(C5) のみ” とすると SQL エラーとなる。
  • HAVING 句に WHERE 句の書式(例:HAVING COUNT(*) >= 10 AND …)を混同しがち。

FAQ

Q: BETWEEN 句は境界値を含みますか?
A: はい、「BETWEEN 値1 AND 値2」は両端値を含みます。本問でも “BETWEEN 1 AND 1000” が 1~1,000 の 1,000 行を取得します。
Q: HAVING 句と WHERE 句はどちらを先に評価しますか?
A: WHERE 句で行を絞り込んだ後に GROUP BY → HAVING の順です。本問は集計後の行数条件なので HAVING を使用します。
Q: GROUP BY に含めない列を SELECT 句に書けますか?
A: 集計関数以外の列は GROUP BY に必ず含める必要があります。含めないと SQL 標準でエラーになります。

関連キーワード: 表探索、非クラスタ索引、BETWEEN述語、GROUP BY, HAVING条件

設問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. (f) と (l) の決定
    • 【問題文】「ディスクに対してデータページを順次に入出力する場合…非同期」→ SQL1A/SQL2A は全表読み=順次 → 非同期。
    • 「ランダムに入出力する場合…同期」→ SQL3A は非クラスタ索引+バッファミス ⇒ ランダム → 同期。
  2. (g) の決定
    • 表6「SQL2A SQL 処理 1,000 秒、CPU 10 秒」。非同期なので 、1,000>10 ⇒ I/O=1,000 秒。
  3. (h) の決定
    • 表6「SQL1A CPU 2,010 秒」。ページ入力 CPU=10 秒と記述済み → 差分 2,000 秒が行移動 CPU。
  4. (i)・(j)・(k) の決定
    • ページ I/O は 1 ms/ページ、ページ数は表1「1,000,000」→ 1,000 秒(j)。
    • 行側:(i)。
    • ページ数 (k) は「1,000,000」。
  5. (m)・(n) の決定
    • 1 行が最大 1 ページに散在→1,000 行で 1,000 ページ(m)。
    • T2 の式は「10 ミリ秒ページ × (n)ページ」、行数=ページ数の最悪ケースなので (n)=N。

誤りやすいポイント

  • 順次読み込み=非同期と覚えず「バッファヒットだから非同期」と誤解する。
  • SQL1A と SQL2A の CPU 時間を合算して (h) を算出するミス。
  • と取り違えて (i) を桁違いに計算。
  • 非クラスタ索引=必ずランダム I/O ではないと疑い、(l) を誤答する。

FAQ

Q: 順次読みでもバッファヒット率が高いと同期になるのでは?
A: 【問題文】は I/O パターンだけで同期/非同期を決定しており、バッファヒットは索引ページのみ条件付きです。順次アクセスであれば非同期と判断します。
Q: なぜ SQL3A の最大ページ数が 1,000 になるのですか?
A: 表1 で “TA” は 1 ページ 20 行です。最悪 1 行 1 ページに散らばると 1,000 行検索で 1,000 ページになります(指数分布を考えなくてよい旨が「最大で」として与えられています)。
Q: ページ I/O 1 ms はどこから来ますか?
A: 分析 A に示された実験式 が根拠で、(k) に 1,000,000 を代入すると 1,000 秒と整合します。

関連キーワード: 非同期I/O, 同期I/O, クラスタ索引、ページアクセス、実験式

設問3〔UPDATE文の処理時間の測定〕におけるG氏の要望について、(1)~(3)に答えよ。

(1) 要望 ①に対応するために、F さんは SQL5Aとデッドロックが起きる可能性がある UPDATE 文の例を次のように作成した。 このSQL 文中の(ア)に入れる適切な字句を答えよ。また、このときにデッドロックが起きる理由を、35字以内で述べよ。 ここで、WHERE 句の述語 1個だけで 1,000 行を更新し、かつ、アクセス経路は索引探索に限るものとする。  UPDATE TA SET C5 = C5 + 1 WHERE (ア)

模範解答

ア:C2 BETWEEN 1 AND 1000 理由:・アクセス経路によって行を更新する順番が異なるから    ・索引 TAX1と索引 TAX2とでは行を更新する順番が異なるから

解説

解答の論理構成

  1. 制約整理
    • 【問題文】「WHERE 句の述語 1個だけで 1,000 行を更新」
    • 「アクセス経路は索引探索に限る」
    • 更新対象は
      TA
      テーブル。
  2. 既存 SQL5A の挙動
    • SQL5A:
      UPDATE TA SET C5 = C5 + 1 WHERE C1 BETWEEN 1 AND 1000
    • 索引 "TAX1"
      C1
      、クラスタ)で順にロック取得。
  3. デッドロックを誘発する別 UPDATE 文
    • 同じ 1,000 行を 別順序 でロックする必要がある。
    • 索引 "TAX2"
      C2
      、非クラスタ)が使える条件は
      C2 =
      C2 BETWEEN
      、…。
    • C2 BETWEEN 1 AND 1000
      なら 1,000 行・索引探索・述語 1個をすべて満たす。
  4. デッドロックの理由
    • 片方は "TAX1" 昇順、もう片方は "TAX2" 昇順でロックを取得。
    • 【問題文】「排他制御は行単位」なので取得順序が逆転しやすく、互いに相手のロックを待つ状態=デッドロック。

誤りやすいポイント

  • C3
    C4
    を条件にすると 1,000 行にならず制約違反。
  • C1 = ...
    などユニーク条件は 1 行しか更新せず不適。
  • BETWEEN
    は上限と下限を逆に書くと索引が利用されない製品もあるので注意。
  • 同じ索引を使う条件を書いてもロック順序が同じになり、デッドロックは起きにくい。

FAQ

Q: なぜ
IN (… )
ではなく
BETWEEN
を選ぶのですか?
A: 【問題文】「索引探索に使える述語」に
BETWEEN
が明示されており、1,000 行を連続範囲でまとめて取得できるためです。
Q: 非クラスタ索引でもロックされるのはデータページですか?
A: 行ロック取得時、索引キー経由で該当行を特定しデータページ上でロックします。索引自体へのロックは意識しなくて構いません。
Q: READ COMMITTED ならロック時間は短いのでは?
A: 行更新を伴うため排他ロックはコミットまで保持されます。したがって並行トランザクション間で待ち合わせが発生し、デッドロックが成立します。

関連キーワード: デッドロック、クラスタ索引、非クラスタ索引、行ロック、アクセス経路

設問3〔UPDATE文の処理時間の測定〕におけるG氏の要望について、(1)~(3)に答えよ。

(2) 要望②に対応するために推定した表7中の(o)〜(q)に入れる適切な字句を答えよ。

模範解答

o:2,000 p:500 q:2,000

解説

解答の論理構成

  1. 区分 1 本の処理量
    • “TA” ¼行 = 5,000,000 行、データページ 250,000
    • “TB” ¼行 = 500,000 行、同じく 250,000 ページ
  2. 実験式で 1 本分を算出
    • CPU: 0.2ms × 行数 → TA 1,000 秒、TB 100 秒
    • データ I/O: 1ms × (読+書)ページ数 → 1ms × 500,000 = 500 秒
    • ログ I/O: 1ms × (2×ページ) → 1ms × 500,000 = 500 秒
  3. 4 併行時の I/O 競合整理
    • データページは 4 ディスクに分散【問題文】「各区分を異なるディスク」→ 4 本同時でも 500 秒
    • ログページは 1 ディスク集中【問題文】「同じディスクに対して、同時に入出力を行うことはない。」→ 500 秒 × 4 = 2,000 秒
  4. 欠落項目の決定
    • TA ログ I/O (o): 2,000 秒
    • TB データ I/O (p): 500 秒
    • TB ログ I/O (q): 2,000 秒

誤りやすいポイント

  • データページとログページのディスクが別でも、ログは 1 台しかないため直列化される点を見落とす。
  • 読み込みページ数だけで計算し、書き込み分を掛け忘れる。
  • “MAX” の取り方を忘れ、CPU とデータ I/O の大きい方を直接足してしまう。

FAQ

Q: なぜデータ I/O は 4 倍にならないのですか?
A: 各区分を「異なるディスク」に配置しているので 4 本が同時実行されてもディスク競合がなく、最長でも 1 本分の 500 秒で済みます。
Q: ログディスクを複数に増やせば (o)(q) を短縮できますか?
A: はい。ログページの並列出力が可能になり、4 本分が同時に流れるため 500 秒程度に圧縮できます。
Q: ページサイズの違いは計算に影響しますか?
A: ページサイズは共通で 4,096 バイト【問題文】なので、行長が違っても「ページ当たり行数」と「総ページ数」で整理すれば式にそのまま適用できます。

関連キーワード: ページ I/O, クラスタ索引、ログ先行書き込み、ディスク競合、並列更新

設問3〔UPDATE文の処理時間の測定〕におけるG氏の要望について、(1)~(3)に答えよ。

(3) SQL6A を実行したとき、ログ先行出力機能の動作条件である事象 A〜Cのうち、発生しない事象がある。 発生しない事象を記号で答え、その理由を本文中の用語を用いて、25字以内で述べよ。 ここで、ほかに実行中の更新処理はないものとする。

模範解答

記号:B 又は C 理由:  記号を Bと解答した場合   ・高々1,000行を更新してコミットするから   ・ログバッファが一杯になる前にコミットするから  記号を Cと解答した場合   ・高々1,000行を更新してコミットするから   ・データバッファが一杯になる前にコミットするから

解説

解答の論理構成

  1. 更新行数の上限
    SQL6A の仕様は【表5】「UPDATE TA SET C5 = C5 + 1 WHERE C1 BETWEEN 1 AND :hv」であり、「ホスト変数によって指定」しても 「高々1,000行を更新してコミットする」(本文)とされている。
  2. データページ計算
    【表1】で “TA” は 「1ページ当たりの行数 20」
    更新対象ページ数は ページ。
  3. ログページ計算
    本文「1ページ中の全行を更新するごとにログページが2ページ」とある。
    よってログページ数は ページ。
  4. バッファ容量との比較
    仕様6‐7より「データバッファとログバッファの大きさは、ともに 2,000ページ」。
    50ページ・100ページではどちらのバッファも一杯にならない。
  5. 事象発生可否
    • 事象A:「トランザクションが、コミット…」→コミットするので必ず発生。
    • 事象B:「ログバッファが、ログページによって一杯…」→100ページ<2,000ページなので発生しない。
    • 事象C:「データバッファが、変更データページによって一杯…」→50ページ<2,000ページなので発生しない。
      よって B か C のいずれかを選べる。

誤りやすいポイント

  • 「コミット回数=1回」と早合点して行数を無制限に考えてしまう。
  • 行数をそのままバッファ容量と比較し、ページ換算を忘れる。
  • 事象B と事象C が “両方とも” 起きないと読み取れず、A を選んでしまう。

FAQ

Q: なぜ「B」と「C」の両方が起きないのに、片方だけ答えてよいのですか?
A: 問題文が「発生しない事象を記号で答え」と単数形なので、両方のうちどちらか一つを示せば正答とされるためです。
Q: 更新行数が 1,000 行を超えたら答えは変わりますか?
A: バッファを埋めるほど大量に更新すれば B または C が発生し得ます。判断にはページ数とバッファ容量の比較が必須です。

関連キーワード: バッファ管理、ログ先行書き込み、ページ単位入出力、クラスタ索引、コミット
戦国ITクイズ機能

\ せっかくなら /

データベーススペシャリスト
クイズ形式で学習しませんか?

クイズ画面へ遷移する

すぐに利用可能!

©︎2026 情報処理技術者試験対策アプリ

このサイトについてプライバシーポリシー利用規約特商法表記開発者について