web-dev-qa-db-ja.com

postgresで作成されたクエリの履歴を取得することは可能ですか?

Postgresで作成されたクエリの履歴を取得することは可能ですか?そして、各クエリにかかった時間を取得することは可能ですか?現在、作業中のアプリケーションで遅いクエリを特定しようとしています。

Postgres 8.3.5を使用しています

53
Chiwai Chan

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

これは、設定ファイルを変更する場合とは異なり、データベースのスーパーユーザーである必要がないため便利です。また、新しいコードを開発してテストする場合は使いやすいです。

65
Greg Smith

遅いクエリを識別したい場合、メソッドは log_min_duration_statement 設定(postgresql.confまたはset-per- ALTER DATABASE SETを使用したデータベース)。

データをログに記録したら、grepまたは pgFouine または独自の analyzer などの特殊なツールを使用できます。これには適切なドキュメントがありませんが、それでも十分に実行できます。

3
user80168

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

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

0
Vincent De Smet

[〜#〜] ui [〜#〜]Navicat

whereに関するファイルを使用して履歴を保存するように設定する必要があります。

これが空白の場合、Navicatは空白になります。

enter image description here

PS:私はNavicatまたはその関連会社と提携していません。ただ助けを探しています。

0
JayRizzo