みなさん、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ツールで実行時間を確認するには
pgAdmin
や DBeaver
などのツールでも、クエリの実行結果の下に「処理時間」が表示されるようになっています。
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_directory
や log_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
を使った遅延クエリのログ出力は、パフォーマンス監視や改善において非常に効果的です。
クエリの速度は、アプリケーション全体のユーザー体験を左右する重要な要素。だからこそ、実行時間を「なんとなく」ではなく、「数値で」把握することが、エンジニアとしての第一歩です。
コメント