SQL

SQLパフォーマンス

SQLの書き方によるパフォーマンスチューニング
SQLを作成するうえで気を付けるべき基本的な事

ソート回避

物理メモリが使用されると劇的に遅い

  • GROUP BY
  • ORDER BY
  • SUMやMAXなどの集計関数
  • DISTINCT
  • UNIONなどの集合演算子
  • RANKなどのOLAP関数

インデックスを確実に使う

インデックスが使われない書き方

  • 項目に計算している (amount * 1.1 > 1000など)
  • IS NULL
     ※MySQL、PostgreSQLはNULLをインデックスに格納する
  • <>,NOT INなどの否定形
  • OR文
  • 復号インデックスと列指定条件順序が異なる
  • 部分一致、後方一致
  • 暗黙の型変換

また、インデックスは適切に作成する
- カーディナリティの高いカラム
- マルチカラムインデックスの検討する
- カバリングインデックスを使用する

中間テーブルを減らす

  • サブクエリNG
  • 集約より先に結合する
  • Viewは使わない

メモリアクセスを減らす

  • レコードの存在チェックでCOUNTを使わない
     ※LIMITやROWNUMを使用する

そもそも遅いのはなぜか

  • 1つのSQLが遅い
    • チューニングする
  • 1回では遅くないSQLを複数回実行している
    • 1回でまとめてとるなど、実行回数を減らす

最初は早かったけど運用していく中で遅くなる

  • 単純にデータ量の増加
  • 機能変更などによりデータアクセスパターンの変化
  • アクセス量の増加

大量データ削除で考える事

リソースを奪ってしまい、サービスが停止/遅くなるのを防ぐ。
途中sleepを入れながら、少しずつ削除する。