データベーススペシャリスト試験対策:SQL効率化と計算量の考え方まとめ
1. SQL効率化の出題パターン
全表スキャン回避
-
原因例
- WHERE句で関数や計算を使用し、インデックスが効かない
- LIKEの前方一致以外(
%abc
)でフルスキャン
-
対策
- 関数を外し列を直接比較
- LIKE検索形を見直す、全文検索インデックス活用
結合順序・結合方式の最適化
- 小さい表を先に読み込む
- 結合キーにインデックスを付与
- ハッシュ結合 / マージ結合 / ネストループ結合の特性を理解して使い分け
不要な列・行を早く絞る
-
SELECT *
を避ける - WHEREやJOIN条件で早期絞り込み
集計処理の効率化
- GROUP BYやDISTINCTの負荷を減らす
- カバリングインデックスを使う
サブクエリ改善
- 相関サブクエリをJOINに書き換え
- EXISTS/NOT EXISTSを適切に利用
2. 試験での解答構成例
現象 → 原因(実行計画の特徴) → 対策
例:
現象:インデックスが存在するが全表スキャンになっている。
原因:WHERE句で日付列を関数で加工しており、インデックスが利用できない。
対策:日付列をそのまま比較する形にSQLを書き換える。
3. データベースにおける計算量(O記法)
よく使う計算量例
処理方法 | 計算量 | 説明 |
---|---|---|
全表スキャン | O(n) | 行数に比例して処理時間増加 |
B-tree探索 | O(log n) | データ増加に対して緩やかに増加 |
無索引ネストループ | O(n × m) | 外側テーブル行ごとに全走査 |
索引付きネストループ | O(n × log m) | 内側探索が高速化 |
ソート | O(n log n) | 行数増加に対して比較的効率的 |
4. 計算量と試験での問われ方
- 記号そのものより**「データ量が倍になったら処理時間はどうなるか」**という形で問われやすい
- インデックス有無や結合方式の違いによる処理時間の増減を説明できることが重要
5. まとめ
- SQL効率化は午後試験の定番テーマ
- 実行計画の読み取り能力が鍵
- 計算量の概念はアルゴリズム比較や処理方式説明で有効
- 現象→原因→対策の書き方を習慣化すると得点アップ