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

応用情報技術者 2011年 秋期 午前232


問題文

部品表のメーカコード列に対し,B+木インデックスを作成した。これによって、検索の性能改善が最も期待できる操作はどれか。ここで、部品及びメーカのデータ件数は十分に多く、メーカコードの値は均一に分散されているものとする。また、ごく少数の行には、メーカコード列にNULLが設定されている。

選択肢

メーカコードの値が1001以外の部品を検索する。
メーカコードの値が1001でも4001でもない部品を検索する。
メーカコードの値が4001以上,4003以下の部品を検索する。(正解)
メーカコードの値がNULL以外の部品を検索する。

🔒 解説は解答すると表示されます

B+木インデックス【午前2解説】

正解の理由

B+木インデックスはキーが順序付けられて葉ノードが連結リスト状に並ぶ構造を持つため、連続したキー範囲の検索(範囲検索)を葉ノードを先頭から順に辿るだけで効率よく行えます。したがって、メーカコードについて「ある連続した範囲内」を取り出す処理(に該当するような範囲検索)が最も大きな性能向上を期待できます。
また条件として「値は均一に分散」「件数が多い」「NULLはごく少数」とあるため、範囲に該当する行だけを短時間で順次取得でき、ディスクI/Oやランダムアクセスが大幅に減る点が効いてきます。
なお、NULL値の扱いはDBMSによって異なります(例: Oracle の B-tree では完全に NULL のキーは索引エントリに含めないことがある一方、MySQL/InnoDB や PostgreSQL の B-tree では NULL を含むことがある)。今回は NULL がごく少数であるため、DBMS差による影響は全体性能に与える影響は小さいと考えられます。

解法ステップ

  1. インデックス(B+木)の特徴を思い出す:順序付けられたキー、葉ノードの連結、範囲走査が得意。
  2. 各選択肢を「点検索(=特定値)」「否定条件(=〜以外)」「範囲検索」「NULL判定」のどれかに分類する。
  3. B+木が最も効果を発揮するのは「範囲検索」であると判断する。
  4. NULLの扱いについてはDBMS差があることを念頭に置き、問題条件(ごく少数のNULL)と照らして影響が小さいことを確認する。
  5. よって範囲を指定する選択肢(に該当するもの)が正解であると結論付ける。

選択肢別の誤答解説

  • ア(特定の値を除外する検索): 「特定の値以外」を選ぶ条件は除外条件(NOT 等)になり、該当行が多数になる可能性が高い。インデックスで該当行を1つずつ拾っていくよりもテーブル全体の走査(フルスキャン)が効率的になることが多い。
  • イ(複数の特定値を除外する検索): 複数値を排除する否定条件も同様に広範囲を対象にするためインデックス効果は小さい。インデックスの有無にかかわらず多数の行を読む必要がある。
  • (メーカコードの連続範囲を指定する検索): B+木の葉ノードは順次アクセスできるため、範囲の先頭を特定してから隣接する葉を順に辿るだけで済む。ランダムI/Oを最小化でき、明確に有利。
  • エ(NULL以外を検索): NULL以外を選ぶ条件は「ほとんどすべての行」を選ぶことになりがちで、インデックスで多数のエントリを走査するとかえって効率が悪い。さらに、NULL の索引への含有は DBMS により異なるため動作が変わる点にも注意(ただし本問では NULL はごく少数なので全体影響は小さい)。

よくある誤解

  • 誤解1: 「インデックスは常に検索を高速化する」
    → インデックスは選択性(検索結果が少ないこと)が高い場合に有効。対象が多数ある否定条件や「ほぼ全部」を選ぶクエリではフルスキャンの方が速いことがある。
  • 誤解2: 「NULLはどのDBでもインデックスに含まれない」
    → DBMS によって扱いが異なる(例: Oracle は全て NULL のキーを索引化しないことがあるが、MySQL/PostgreSQL は NULL を含む場合がある)。少数の NULL であれば性能影響は小さい。

補足コラム

  • B+木とハッシュインデックスの比較:ハッシュは等価検索(=特定の値を探す)では非常に速いが、範囲検索には対応できない。一方 B+木は等価検索にも範囲検索にも向いているため汎用性が高い。
  • カバリングインデックス:検索に必要な列がすべてインデックスに含まれていればテーブル本体アクセスが不要となりさらに高速化する。今回のようにインデックスが対象列だけで、かつ行全体が必要なら追加のテーブルアクセス(ルックアップ)が発生する点に注意。

FAQ

Q1: NULL を含む行を条件にした検索はどう扱えばよいですか?
A1: DBMS により挙動が違うため、本番運用では使用するDBMSのドキュメントで NULL のインデックス含有ルールを確認してください。設問のように NULL がごく少数ならば性能への影響は限定的です。
Q2: 「NOT 等」条件でもインデックスを使える場合はありますか?
A2: 一部のケース(ビットマップインデックスや複合インデックスを組み合わせた最適化)で使われることがありますが、一般的なB+木単体では「NOT 条件」は選択性が低くなるため不利です。
Q3: 範囲が非常に小さい場合と非常に大きい場合での振る舞いは?
A3: 小さい範囲ならインデックス効果が大きい。範囲が大きくて対象行が多数に及ぶ場合はフルスキャンの方が効率的になることがある。

関連キーワード: B+木、インデックス、範囲検索、選択性、NULL値、順次走査、等価検索、ハッシュインデックス
← 前の問題へこの年度をクイズで解く次の問題へ →
戦国ITクイズ機能

\ せっかくなら /

応用情報技術者
クイズ形式で学習しませんか?

クイズ画面へ遷移する

すぐに利用可能!

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

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