💨

【過去Blogからの移行記事】初心者級SQLチューニング(DB環境はPostgreSQL)

2022/09/18に公開

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

本日は以上です。

Discussion