初心者級SQLチューニング(DB環境はPostgreSQL)

11月から昨日まで、職場でSQLの速度改善のためにpg_stat(PostgreSQLの統計情報)とニラメッコしまくりだった。
昔からSQLにだけは深入りしたくないと思ってたけど、いよいよやる羽目になったのでしんどかったw

要点を簡潔にまとめると、下記のとおり。

【使う技(3種)】

・統計情報をリセットするSQL文
select pg_stat_reset();
※要postgres権限
・色々ある統計情報のうち、とりあえずTABLEスキャンとINDEXスキャンの情報を見るSQL文
SELECT
  *
FROM
  pg_stat_user_tables
ORDER BY
  seq_tup_read DESC
  , idx_tup_fetch DESC;
・クエリの実行プラン(の解析情報)を見るSQL文
EXPLAIN ANALYZE
※これに続けて、実行プランを解析したい対象のSQL文を書いて実行するだけ。

 

 【上記を使ってやる作業】

  1. スロークエリだと判っているとあるSQL文について、開発対象のシステムの機能から実行して、その時のSQLログを取り出す。
  2. 対象SQLの取り扱っているテーブルに対して、できるだけ抽出対象のレコードと余計なレコードとを織り交ぜて登録しておく。
  3. 対象SQLをEXPLAIN ANALYZEして、実行プランのrowsが余計なレコードも含んでそうな値になってたら、それの対策を打つ。(SQLの組み換えとか組み直しとか)
  4. さらに。統計情報をクリアしてEXPLAIN ANALYZEし、直後のpg_stat_user_tablesを見る。そこでseq_scanやseq_tup_readが余計なレコードに対してもかかっているようなら、うまいことINDEXを使うようにSQLを工夫する。(追加のINDEXを検討したり、絞込みだけするSELECTを用意してその結果をASで別名にしてその後のJOINで使ったり)
  5. 納得いくまで上記を繰り返す。
 以上。

作業内容を上記に絞り込むまでには色々とWeb漁って用語や動作原理的なところの下調べをやったんだけど、ややこしいことをとっぱらっていったら、これだけになったw

------------------------------------------------
調査の過程で特に参考にしたページを、下記に羅列しておきます。

インデックスを作成して,SQLの速度をチューニングする手順 (PostgreSQLで,EXPLAIN文とCREATE INDEX文によるパフォーマンス改善)
http://d.hatena.ne.jp/language_and_engineering/20110121/p1

稼動統計情報を活用しよう(3)
http://lets.postgresql.jp/documents/technical/statistics/3

スロークエリの改善
http://lets.postgresql.jp/documents/technical/query_tuning/

PostgreSQLを遅くしている犯人はどこだ? (2/3)
http://www.atmarkit.co.jp/ait/articles/0806/09/news125_2.html

[PostgreSQL]Explain Analyzeで、多重JOINしたSQLをチューニングする
http://dqn.sakusakutto.jp/2011/11/postgresqlexplain_analyzejoins_1.html

confのチューニング
http://sweng.web.fc2.com/ja/database/postgresql/tuning.html
http://www.desknets.com/neo/faq/result/1337/
http://old.postgresql.jp/wg/shikumi/doc/kataoka_check_your_config.pdf

本日は以上です。

コメント

このブログの人気の投稿

LaravelのTestCaseを継承したテストにて use RefreshDatabase を使って artisan db:seed --class='TestSeeder' まで実行させるやり方

ZF3で空のプロジェクトを作成する自分なりの手順

Androidでical4jを使う