web-dev-qa-db-fra.com

Est-il possible d'avoir un historique des requêtes faites dans postgres

Est-il possible d'avoir un historique des requêtes faites dans postgres? et est-il possible d'obtenir le temps nécessaire à chaque requête? J'essaie actuellement d'identifier les requêtes lentes dans l'application sur laquelle je travaille.

J'utilise Postgres 8.3.5

48
Chiwai Chan

Il n'y a pas d'historique dans la base de données elle-même. Si vous utilisez psql, vous pouvez utiliser "\ s" pour afficher l'historique de vos commandes.

Vous pouvez obtenir des requêtes futures ou d’autres types d’opérations dans les fichiers journaux en définissant log_statement dans le fichier postgresql.conf. Ce que vous voulez probablement à la place, c'est log_min_duration_statement , qui, si vous le définissez sur 0, enregistrera toutes les requêtes et leurs durées dans les journaux. Cela peut être utile une fois que vos applications sont mises en ligne. Si vous définissez une valeur plus élevée, vous ne verrez que les requêtes de longue durée qui peuvent être utiles pour l'optimisation (vous pouvez exécuter EXPLAIN ANALYZE sur les requêtes que vous trouverez ici pour comprendre pourquoi elles êtes lent).

Une autre chose utile à savoir dans ce domaine est que si vous exécutez psql et que vous lui dites "\ timing", il montrera combien de temps chaque déclaration prend ensuite. Donc, si vous avez un fichier SQL qui ressemble à ceci:

\timing
select 1;

Vous pouvez l'exécuter avec les bons indicateurs et voir chaque déclaration entrelacée avec le temps qu'il a fallu. Voici comment et à quoi ressemble le résultat:

$ psql -ef test.sql 
Timing is on.
select 1;
 ?column? 
----------
        1
(1 row)

Time: 1.196 ms

Ceci est pratique car vous n'avez pas besoin d'être superutilisateur de la base de données pour l'utiliser, contrairement à la modification du fichier de configuration, et il est plus facile à utiliser si vous développez du nouveau code et souhaitez le tester.

62
Greg Smith

Si vous souhaitez identifier les requêtes lentes, la méthode consiste à utiliser log_min_duration_statement setting (dans postgresql.conf ou défini par base de données avec ALTER DATABASE SET).

Lorsque vous avez enregistré les données, vous pouvez ensuite utiliser grep ou des outils spécialisés, tels que pgFouine ou mon propre analyseur - qui ne disposent pas de la documentation appropriée, mais malgré cela, fonctionnent assez bien.

3
user80168

pgBadger est une autre option - également répertoriée ici: https://github.com/dhamaniasad/awesome-postgres#utilities

Nécessite au préalable une configuration supplémentaire pour capturer les données nécessaires dans les journaux postgres, voir le site officiel.

0
Vincent De Smet

FYI pour ceux qui utilisent le UINavicat :

Vous DEVEZ définir vos préférences pour utiliser un fichier sur where pour stocker l'historique.

S'il est vide, votre Navicat sera vide.

 enter image description here

PS: Je n'ai aucune affiliation avec Navicat ni avec ses filiales. Je cherche juste à aider.

0
JayRizzo