忍者ブログ
IT関係の小作人労働の日々の日記です。 最近データベースが好きです。 インフラ構築、DB構築、アプリケーション開発・・・何でも屋です。 何でもできそうで、何にもできない。

【データベースの知識】SQLパフォーマンスチューニングの即効ヒント


同じ結果を得るSQLでも、書き方ひとつでデータベース内部の「仕事量」は劇的に変わります。今回は、明日からの開発でそのまま使える、実行速度を劇的に改善するための6つのTipsを紹介します。

1. 実行効率を高める書き方の基本

【 基本 】 データベースエンジンにとって、無駄なスキャンや重複排除(ソート)は最大の敵です。まずは、より効率的な演算子や関数を選ぶことから始めましょう。

COUNTよりEXISTS:1件見つかった瞬間に検索を終了するため、全件カウントするより圧倒的に高速です。
UNIONよりUNION ALL:UNIONは重複を消すために内部で「ソート」が発生します。重複がないと分かっているならALL一択です。
ORよりIN:ORを多用するとインデックスが効かなくなる場合があります。複数の値を指定するならIN演算子の方が最適化されやすいです。

2. インデックスとデータアクセスの最適化

【 ポイント 】 インデックスはただ作るだけでなく、「使われるように書く」のがコツです。また、読み込むデータの範囲をいかに絞り込むかが勝負を分けます。

インデックスの作成:WHERE句やJOINの結合キーには必ずインデックスを検討しましょう。
COUNT(*)より主キー参照:製品によっては、主キーを指定することでインデックススキャンのみで処理が完結し、高速化する場合があります。
範囲指定はBETWEEN:`col > 10 AND col < 20` と書くより、`BETWEEN` を使う方がオプティマイザが範囲を正しく認識しやすく、読みやすいSQLになります。

3. まとめ:チューニングの優先順位

闇雲に修正するのではなく、まずは以下の表を参考に、コストの高い部分から手を入れていきましょう。

改善項目修正前推奨(修正後)効果の理由
存在確認 COUNT(*) > 0 EXISTS 見つかったら即終了
集合演算 UNION UNION ALL ソート処理をスキップ
複数指定 OR ... OR ... IN ( ... ) 可読性と解析効率の向上


パフォーマンスチューニングに「銀の弾丸」はありませんが、これらの定石を組み合わせることで、システムのレスポンスは確実に見違えるはずです。

PR