compass

SQLのパフォーマンス

created : / updated :

SQLの実行時間

一般的にSQLの実行時間の大半はストレージに対するI/Oに費やされる。SQLのパフォーマンスはストレージへのI/Oをどれだけ減らせるかが鍵となる。

入力されたクエリに応じて、どのようにデータを探すかはDBMS(データベースマネジメントシステム)が選択している。いくつかの実行計画の中から、コストパフォーマンスを比較して一番効率が良いものを選んでいる。

結合アルゴリズム

結合はSQL性能問題の火薬庫である。

一般的なRDSでは、テーブルAとBの結合処理は以下のようになる。

  1. テーブルAを1行ずつスキャンする
  2. テーブルAの1行ごとに、テーブルBを1行ずつスキャンして、結合条件に合致すればそれを返却する
  3. この動作をテーブルAのすべての行に対して繰り返す

テーブルAとテーブルBの結合対象となる行数を R(A)、R(B) とすると、アクセスされる行数は R(A) * R(B) となる。

このとき、テーブルBの結合キーにインデックスが存在し、かつ結合キーにヒットする行数が少ない場合、2. の繰り返し処理が高速化される。

テーブルAを小さくする、テーブルBの結合キーにインデックスを作る。これがSQLチューニングの基本中の基本となる。これを意識したテーブル設計ができるとよい。

インデックス

インデックスを作れば無条件に高速化されるわけではない。

インデックスの利用が有効になるかの判断基準は以下である。

  • 値がよくばらついていること(カーディナリティが高いこと)
  • 少ない行数に絞り込むことが多いこと
    • 5%未満に絞り込める条件ならば、その列集合についてインデックスを作る価値がある

参考文献