【DBテクニック】SQLの実行速度を劇的に変える「チューニングの定石」
同じ結果を得るSQLでも、書き方ひとつでデータベース内部の「仕事量」は天と地ほど変わります。今回は、実行計画を意識した「現場で即効性のある」チューニングの一般事項を整理しました。
1. 検索アルゴリズムを最適化する
【 現場の感触 】 データベースに「無駄な探索」をさせないのが基本です。特に存在確認などは、最後まで数えるか、見つかった瞬間に止めるかで雲泥の差が出ます。
★ ORよりIN:ORを多用するとインデックスが効かなくなる場合がありますが、IN演算子(定数リスト)はオプティマイザが最適化しやすく、実行計画が安定します。
★ 「<」「>」よりBETWEEN:範囲指定が明確になり、インデックスレンジスキャンの効率が上がります。
2. 余計な「ソート」と「スキャン」を削る
【 現場の感触 】 データベースにとって最も重い処理の一つが「重複排除(ソート)」と「全表スキャン」です。これらを回避する選択がパフォーマンスの鍵です。
★ COUNT(*)よりCOUNT(主キー):製品によりますが、主キーを指定することで「インデックスだけを見れば済む(Index Only Scan)」状態になり、データ本体へのアクセスを減らせる場合があります。
★ インデックスの作成:言うまでもなく基本中の基本。WHERE句やJOINキーへの適切なインデックス配置が全ての土台です。
3. 解析器(オプティマイザ)のクセを掴む
【 現場の感触 】 SQLは「書いた順序」が評価に影響することがあります。データベースの解析エンジンがどう動くかを意識して記述しましょう。
★ WHERE句の記述順序:多くのDBではWHERE句に書かれた順にフィルターをかけます。データ件数をより大きく絞り込める条件を「先に」書くことで、後続の判定対象を減らすのがセオリーです。
4. まとめ:チューニングは「DBとの対話」
今回紹介した項目は、いずれも「DBの内部リソース(CPU・メモリ・I/O)をいかに節約するか」に直結しています。
1. 重複排除(UNION)を無意識に使っていないか?
2. 全件カウント(COUNT)で存在確認していないか?
3. WHERE句の条件順序は最適か?
一つ一つは小さな工夫ですが、大量データを扱う本番環境ではこの積み重ねが「100倍の速度差」となって現れます。実行計画(EXPLAIN)を確認しながら、最適な一文を追求していきましょう。