postgresで行われたクエリの履歴を取得することは可能ですか?各クエリにかかった時間を取得することは可能ですか?私は現在、作業中のアプリケーションで遅いクエリを識別しようとしています。
Postgres8.3.5を使用しています
postgresで行われたクエリの履歴を取得することは可能ですか?各クエリにかかった時間を取得することは可能ですか?私は現在、作業中のアプリケーションで遅いクエリを識別しようとしています。
Postgres8.3.5を使用しています
データベース自体には履歴はありません。psql を使用している場合は、"\s" を使用してコマンド履歴を確認できます。
postgresql.conf ファイルでlog_statementを設定することにより、今後のクエリやその他の種類の操作をログ ファイルに取り込むことができます。おそらく代わりに必要なのはlog_min_duration_statementです。これを 0 に設定すると、すべてのクエリとその期間がログに記録されます。これは、アプリがライブになったときに役立ちます。これをより高い値に設定すると、最適化に役立つ長時間実行されるクエリのみが表示されます (そこにあるクエリに対して EXPLAIN ANALYZE を実行して、その理由を突き止めることができます)。遅いです)。
この分野で知っておくと便利なもう 1 つのことは、psql を実行して "\timing" を指定すると、その後のすべてのステートメントにかかる時間が表示されることです。したがって、次のような sql ファイルがあるとします。
\timing
select 1;
適切なフラグを付けて実行すると、各ステートメントがかかった時間と交互に表示されます。結果は次のようになります。
$ psql -ef test.sql
Timing is on.
select 1;
?column?
----------
1
(1 row)
Time: 1.196 ms
これは、構成ファイルを変更する場合とは異なり、データベースのスーパーユーザーでなくても使用できるため便利です。また、新しいコードを開発していてテストしたい場合にも簡単に使用できます。
遅いクエリを特定したい場合は、 log_min_duration_statement設定 (postgresql.conf で、または ALTER DATABASE SET でデータベースごとに設定)を使用する方法よりも方法があります。
データをログに記録したら、grep やいくつかの特殊なツール ( pgFouineや独自のアナライザーなど) を使用できます。これには適切なドキュメントがありませんが、これにもかかわらず、非常にうまく動作します。
pgBadger は別のオプションです - ここにもリストされています: https://github.com/dhamaniasad/awesome-postgres#utilities
ただし、postgres ログに必要なデータをキャプチャするには、事前に追加のセットアップが必要です。公式 Web サイトを参照してください。