基本情報技術者 2012年 秋期 午前(科目A) 問27
問題文
関係データベースの表の列に利用者がインデックスを設定する目的はどれか。
選択肢
ア:外部キーの列の値を別の表の主キーの値に一致させる。
イ:データの格納位置への効率的なアクセスが可能となり、検索速度の向上が期待できる。(正解)
ウ:一つの大きなテーブルを複数のディスクに分散格納する場合、ディスク容量が節約できる。
エ:列内に重複する値がないようにする。
##: 関係データベースの表の列に利用者がインデックスを設定する目的はどれか。 【午前2 解説】
要点まとめ
- 結論→インデックスは特定列の検索や整列処理を高速化してクエリ応答時間を大幅に短縮する目的で利用者が設定します。
- 根拠→インデックスは列値と実データ位置を結ぶ追加データ構造(例:B木やハッシュ)を持ち、物理I/O回数を減らします。
- 差がつくポイント→更新コストや領域増大、列の選択性や結合列の順序を考慮して必要最小限かつ適切な列に設定することが重要です。
正解の理由
正解は イ です。インデックスは列値から対応するレコードの格納位置を効率的に探索できるようにするためのデータ構造を追加します。これによりWHERE句による条件検索、ORDER BYやJOINのキー検索などで走査する行数やディスクI/Oを減らし、検索性能(応答時間)が向上します。典型的にはB木(B+木)やハッシュテーブルが用いられ、検索が高速化される点が理由です。
よくある誤解
- インデックスは常に良い:検索は速くなるがINSERT/UPDATE/DELETEの度にインデックスを更新するため書き込み性能は下がり、領域も増える点を見落としがちです。
- インデックス=参照整合性の保証:外部キーの整合性は制約(FOREIGN KEY)で保証され、インデックスはそれ自体で参照整合性を作るものではありません(ただし参照時の性能向上には寄与します)。
- インデックスで必ず重複を防げる:重複防止はユニーク制約(またはユニークインデックス)によるもので、通常の非ユニークインデックスは重複を許容します。
解法ステップ
- 各選択肢が「インデックスの目的」に合致するかを設問の主語(利用者がインデックスを設定する目的)に照らして判定します。
- アは「外部キーの値を一致させる」は参照整合性の説明であり、制約の話なので誤りと判断します。
- ウは「ディスク容量が節約できる」は逆にインデックスで領域が増えるため誤りです。
- エは「列内に重複がないようにする」はユニーク制約の説明であり、一般的なインデックスの目的とは異なるため誤りです。
- 上記から検索速度向上を示すイが正しいと確定します。
選択肢別の誤答解説
- ア: 外部キーの列の値を別の表の主キーの値に一致させる。
→ 参照整合性はFOREIGN KEY制約で保証され、外部キーにインデックスがなくても整合性チェックは行われます(ただし性能向上のために索引を張ることは多い)。目的としては誤りです。 - イ: データの格納位置への効率的なアクセスが可能となり、検索速度の向上が期待できる。
→ 正解。インデックスは列値からレコード位置へ素早く到達できるようにする追加構造で、検索やソート、結合の効率を上げます。 - ウ: 一つの大きなテーブルを複数のディスクに分散格納する場合、ディスク容量が節約できる。
→ 誤り。インデックスは別途データ構造を保持するため追加のディスク容量を消費します。分散格納(シャーディング等)は別の技術領域です。 - エ: 列内に重複する値がないようにする。
→ 部分的に誤解を招く表現。重複防止はユニークインデックスや制約により実現しますが、一般的なインデックスの主目的は検索性能向上です。
補足コラム
- 主なインデックスタイプ:B木(B+木)インデックスは範囲検索やORDER BYに強く、ハッシュインデックスは等価検索に有利です。
- カバリングインデックス:クエリで必要な全ての列がインデックス内に含まれる場合、テーブル本体を参照せずにクエリを完結でき、さらに高速化します。
- インデックス作成例(SQL):
-- 単純なインデックス CREATE INDEX idx_employee_name ON employee(last_name); -- ユニークインデックス(重複禁止) CREATE UNIQUE INDEX idx_employee_email ON employee(email); -- 複合インデックス(順序に注意) CREATE INDEX idx_orders_customer_date ON orders(customer_id, order_date);
- 運用上の注意点:頻繁に更新される列や低選択性(取り得る値が少ない列)にはインデックス効果が薄く、逆効果になることがあります。定期的に統計情報を更新し、EXPLAINでクエリプランを確認しましょう。
FAQ
Q1: どの列にインデックスを張ればよいですか?
A1: WHERE句やJOINで頻繁に使われる列、高い選択性(多くの異なる値を持つ列)、およびORDER BYやGROUP BYで使う列が候補です。ただし更新頻度と領域コストも考慮してください。
A1: WHERE句やJOINで頻繁に使われる列、高い選択性(多くの異なる値を持つ列)、およびORDER BYやGROUP BYで使う列が候補です。ただし更新頻度と領域コストも考慮してください。
Q2: インデックスはすべての検索を高速化しますか?
A2: いいえ。低選択性列(例:性別など)や小テーブルの全表走査ではインデックスが利用されないことがあり、逆にコストが上がる場合もあります。
A2: いいえ。低選択性列(例:性別など)や小テーブルの全表走査ではインデックスが利用されないことがあり、逆にコストが上がる場合もあります。
Q3: 主キーとインデックスの関係は?
A3: 多くのRDBMSでは主キーに対して自動的にインデックスが作成されます。主キーは一意性と参照性の保証が目的で、インデックスは性能向上のための追加構造です。
A3: 多くのRDBMSでは主キーに対して自動的にインデックスが作成されます。主キーは一意性と参照性の保証が目的で、インデックスは性能向上のための追加構造です。
Q4: インデックス作成のタイミングは?
A4: 本番稼働前に必要なインデックスを設計しておくのが望ましいですが、実際のクエリ実行状況をモニタし、ボトルネックに対して追加するのが現実的です。
A4: 本番稼働前に必要なインデックスを設計しておくのが望ましいですが、実際のクエリ実行状況をモニタし、ボトルネックに対して追加するのが現実的です。
関連キーワード: インデックス、B木、ハッシュインデックス、カバリングインデックス、選択性、クエリ最適化、CREATE INDEX、ユニークインデックス、JOIN最適化、パフォーマンスチューニング

\ せっかくなら /
基本情報技術者を
クイズ形式で学習しませんか?
クイズ画面へ遷移する→
すぐに利用可能!

