【データベースの知識】SQLパフォーマンスチューニングの即効ヒント
同じ結果を得るSQLでも、書き方ひとつでデータベース内部の「仕事量」は劇的に変わります。今回は、明日からの開発でそのまま使える、実行速度を劇的に改善するための6つのTipsを紹介します。
1. 実行効率を高める書き方の基本
【 基本 】 データベースエンジンにとって、無駄なスキャンや重複排除(ソート)は最大の敵です。まずは、より効率的な演算子や関数を選ぶことから始めましょう。
★ COUNTよりEXISTS:1件見つかった瞬間に検索を終了するため、全件カウントするより圧倒的に高速です。
★ UNIONよりUNION ALL:UNIONは重複を消すために内部で「ソート」が発生します。重複がないと分かっているならALL一択です。
★ ORよりIN:ORを多用するとインデックスが効かなくなる場合があります。複数の値を指定するならIN演算子の方が最適化されやすいです。
★ UNIONよりUNION ALL:UNIONは重複を消すために内部で「ソート」が発生します。重複がないと分かっているならALL一択です。
★ ORよりIN:ORを多用するとインデックスが効かなくなる場合があります。複数の値を指定するならIN演算子の方が最適化されやすいです。
2. インデックスとデータアクセスの最適化
【 ポイント 】 インデックスはただ作るだけでなく、「使われるように書く」のがコツです。また、読み込むデータの範囲をいかに絞り込むかが勝負を分けます。
★ インデックスの作成:WHERE句やJOINの結合キーには必ずインデックスを検討しましょう。
★ COUNT(*)より主キー参照:製品によっては、主キーを指定することでインデックススキャンのみで処理が完結し、高速化する場合があります。
★ 範囲指定はBETWEEN:`col > 10 AND col < 20` と書くより、`BETWEEN` を使う方がオプティマイザが範囲を正しく認識しやすく、読みやすいSQLになります。
★ COUNT(*)より主キー参照:製品によっては、主キーを指定することでインデックススキャンのみで処理が完結し、高速化する場合があります。
★ 範囲指定はBETWEEN:`col > 10 AND col < 20` と書くより、`BETWEEN` を使う方がオプティマイザが範囲を正しく認識しやすく、読みやすいSQLになります。
3. まとめ:チューニングの優先順位
闇雲に修正するのではなく、まずは以下の表を参考に、コストの高い部分から手を入れていきましょう。
| 改善項目 | 修正前 | 推奨(修正後) | 効果の理由 |
|---|---|---|---|
| 存在確認 | COUNT(*) > 0 | EXISTS | 見つかったら即終了 |
| 集合演算 | UNION | UNION ALL | ソート処理をスキップ |
| 複数指定 | OR ... OR ... | IN ( ... ) | 可読性と解析効率の向上 |
パフォーマンスチューニングに「銀の弾丸」はありませんが、これらの定石を組み合わせることで、システムのレスポンスは確実に見違えるはずです。
PR