PostgreSQLでクエリの実行時間を測定する方法|\timing・EXPLAIN ANALYZEの使い方を解説

スポンサーリンク

みなさん、PostgreSQLでSQLを書いていると、「あれ?このクエリ、ちょっと遅くない?」と感じる瞬間ってありませんか?

ちょっとしたデータの取得や集計のつもりが、実行に数秒かかるだけでストレスになりますし、業務で扱う大量データになってくると、処理の遅延がシステム全体に影響することもあります。

そこで大切になるのが、「クエリの実行時間を正しく確認すること」。

実行時間を把握することで、原因の切り分けやパフォーマンスチューニングの第一歩を踏み出せるようになります。感覚だけで「なんとなく遅い」と言っていては、根本的な改善にはつながりません。

本記事では、PostgreSQLにおけるクエリの実行時間の測定方法について、初心者の方にもわかりやすく、順を追ってご紹介していきます。

コマンドラインツールの使い方から、開発でよく使われる EXPLAIN ANALYZE の活用法、さらにはログ設定による自動記録まで――実践的な知識をしっかり押さえていきましょう。

実行時間を確認する基本的な方法

\timing コマンドで簡易測定(psql利用時)

PostgreSQLに標準で備わっている「psql」というコマンドラインツールには、クエリの実行時間を簡単に測れる機能が用意されています。それが \timing コマンドです。

まずは、psqlにログインした状態で以下のコマンドを入力してください。

\timing

これで「クエリ実行時間の表示機能」がONになります。その状態で任意のSQLを実行すると、下記のように実行時間が表示されるようになります。

SELECT * FROM users WHERE age > 30;
-- 実行結果の後に表示される
Time: 1.234 ms

もう一度 \timing を打つとOFFになるので、必要に応じて切り替えましょう。

EXPLAIN ANALYZE で詳細な実行計画を見る

クエリの実行時間をもう少し本格的に分析したいときには、EXPLAIN ANALYZE を使います。

たとえば、次のように実行してみましょう。

EXPLAIN ANALYZE SELECT * FROM users WHERE age > 30;

すると、クエリが「どのように実行されたか」が詳細に表示され、最後の行に以下のような実行時間が出てきます。

Execution Time: 2.345 ms

この「Execution Time」が、実際にクエリを実行した時間です。

注意点:EXPLAIN だけだとクエリは実行されず、あくまで「計画」を表示しますが、EXPLAIN ANALYZE本当に実行して時間を計測します。

削除系・更新系のSQLで EXPLAIN ANALYZE を使う場合は、ご注意ください。

GUIツールで実行時間を確認するには

pgAdminDBeaver などのツールでも、クエリの実行結果の下に「処理時間」が表示されるようになっています。

pgAdminなら、クエリエディタでSQLを実行するだけで、下部の「メッセージ」タブに以下のようなログが出ます。

Query returned successfully in 3.456 msec.

ツールによって表記は異なりますが、基本的にはどれも「実行時間」が自動的に表示されます。
普段お使いのツールでどこに表示されているか、ぜひ確認してみてくださいね。

自動で実行時間をログに残す設定

ここまで紹介してきた方法は、基本的に「その場でクエリを実行して、手動で時間を測定する」スタイルでした。

でも、「いちいち手動で見るのは面倒だな」と感じる場面もありますよね。
たとえば、アプリケーションから実行される大量のSQLの中に、どれが遅いクエリなのかを自動で検出したいというようなケースです。

そんなときに便利なのが、PostgreSQLのログ出力設定です。

log_min_duration_statement を設定しよう

PostgreSQLには log_min_duration_statement というパラメータがあります。
これは「指定した時間(ミリ秒)以上かかったクエリだけをログに記録する」というものです。

たとえば、100ミリ秒以上かかったSQLだけをログに記録したい場合は、次のように設定します。

log_min_duration_statement = 100

この設定を postgresql.conf に書いてPostgreSQLを再起動すれば、100msを超えるクエリだけがログに記録されるようになります。

-1 に設定すると「すべてのクエリをログに記録」、0 にすると「すべてのクエリの実行時間だけを記録」という挙動になります。

ログ出力の確認方法

ログの出力先は、通常は postgresql.conf 内の log_directorylog_filename によって指定されています。たとえば以下のようなパスです。

/var/log/postgresql/postgresql-15-main.log

実際にログを見てみると、以下のように記録されているはずです。

duration: 142.531 ms  statement: SELECT * FROM orders WHERE status = 'pending';

これを集計したり、ツールで可視化すれば、「どのSQLがボトルネックになっているか」を自動で洗い出すことも可能になります。

まとめ

PostgreSQLでクエリの実行時間を測定する方法には、いくつかのアプローチがあります。

まずは手軽な \timing で処理時間を確認し、必要に応じて EXPLAIN ANALYZE で詳細な実行計画を確認する――この2つは、日常的な開発やSQLの見直しでとても役に立ちます。

また、GUIツールやログ設定を活用すれば、より自動的に実行時間を記録・分析することもできます。特に log_min_duration_statement を使った遅延クエリのログ出力は、パフォーマンス監視や改善において非常に効果的です。

クエリの速度は、アプリケーション全体のユーザー体験を左右する重要な要素。だからこそ、実行時間を「なんとなく」ではなく、「数値で」把握することが、エンジニアとしての第一歩です。

PostgreSQL
スポンサーリンク
なんくるをフォローする

コメント

タイトルとURLをコピーしました