75

postgresで行われたクエリの履歴を取得することは可能ですか?各クエリにかかった時間を取得することは可能ですか?私は現在、作業中のアプリケーションで遅いクエリを識別しようとしています。

Postgres8.3.5を使用しています

4

8 に答える 8

80

データベース自体には履歴はありません。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

これは、構成ファイルを変更する場合とは異なり、データベースのスーパーユーザーでなくても使用できるため便利です。また、新しいコードを開発していてテストしたい場合にも簡単に使用できます。

于 2009-10-06T04:37:04.310 に答える
4

遅いクエリを特定したい場合は、 log_min_duration_statement設定 (postgresql.conf で、または ALTER DATABASE SET でデータベースごとに設定)を使用する方法よりも方法があります。

データをログに記録したら、grep やいくつかの特殊なツール ( pgFouineや独自のアナライザーなど) を使用できます。これには適切なドキュメントがありませんが、これにもかかわらず、非常にうまく動作します。

于 2009-10-06T06:35:50.343 に答える
0

pgBadger は別のオプションです - ここにもリストされています: https://github.com/dhamaniasad/awesome-postgres#utilities

ただし、postgres ログに必要なデータをキャプチャするには、事前に追加のセットアップが必要です。公式 Web サイトを参照してください。

于 2016-07-29T06:20:31.113 に答える