PostgreSQL:「pg_stat_statements」がちょっと便利になってた件

 

 前回の記事の最後でPostgreSQL10にしたい、的なことをぼやいたおかげか、先日から、ようやく社内でもPostgreSQL10の対応がはじまりました。
 まあそんなに問題も発生せず無事に終わりそうなんですが、性能検証しているときに、PostgreSQLではお馴染みの「pg_stat_statements」を使ってスロークエリを探したりしてたんですね。こいつは、クエリの実行回数やかかった時間などを記録した内容を見せてくれるビューなので、性能検証などで処理が遅い部分などを調べていくときには、とてもお世話になっております。

 で、10にしてはじめて知ったんですが……実はいつの間にか、pg_stat_statementsビューのカラムが追加されてたんですよ。「min_time」「max_time」「mean_time」の3つで、それぞれ名前の通り、そのクエリの実行にかかった「最少時間」「最大時間」「平均時間」を記録してくれます。それまで使ってたVersionで記録してくれる時間は「total_time / 合計時間」だけだったので、微妙に使いにくかったんですよね。こういう追加は助かります。

SELECT 
   query
  ,calls
  ,(mean_time / 1000)::numeric(7,3) AS avg_time_sec
  ,(min_time / 1000)::numeric(7,3) AS min_time_sec
  ,(max_time / 1000)::numeric(7,3) AS max_time_sec
FROM
   pg_stat_statements
--WHERE
--   (max_time / 1000) > 3
ORDER BY
   max_time_sec DESC
LIMIT 20;

--※情報をリセットする場合
--SELECT pg_stat_statements_reset();

image

 こんな感じで使ってます。各時間はミリ秒単位になってるので、僕は1000で割って秒単位に変換してから見ています。検索条件次第で、解析の幅が少し広がりますね。

 調べてみたら9.5から追加されてたようです。これまではずっと9.4を使ってたので、もっと早くバージョンアップさせたかったなぁ……と思いました。いうほど大したものでもないんですけど、地味に便利になりました。この記事が、まだ9.4以前をお使いの方へのバージョンアップの一助になれば……。