Présentation du module db pg_stat_statements
?
Pourquoi l’activation est-elle demandée par les clients ?
Comment est-il activé ?
Le pg_stat_statements
module permet de suivre les statistiques d'exécution de toutes les instructions SQL exécutées par un serveur.
Le module doit être chargé en ajoutant pg_stat_statements
to shared_preload_libraries
in postgresql.conf
, car il nécessite une mémoire partagée supplémentaire. Cela signifie qu’un redémarrage du serveur est nécessaire pour ajouter ou supprimer le module.
Lien : https://www.postgresql.org/docs/9.4/pgstatstatements.html
Pour mettre en oeuvre un schéma de type vue sur cette table qui nous permet de suivre les requêtes qui prennent du temps. Les clients pourront ainsi les régler et optimiser les performances.
Cette extension fournit des mesures sur l’exécution des requêtes : qui sont les requêtes les plus fréquemment exécutées et la durée de chacune d’elles.
pg_stat_statements
Vérifiez que PostgreSQL officiel contrib
Le package de la version postgres est installé.
$ dpkg -l | grep postgres
postgresql-contrib-9.3
S’il n’est pas installé, installez-le.
$ apt-get install postgresql-contrib-9.3
Modifier postgresql.conf
précharger le module au démarrage
Valeur par défaut : shared_preload_libraries = ''
Nouveau: shared_preload_libraries = 'pg_stat_statements'
Si vous utilisez les deux pg_stat_statements
et auto_explain
, utilisez un enregistrement ONE et séparez-le par des virgules :
shared_preload_libraries = 'auto_explain,pg_stat_statements'
Dans la base de données que vous souhaitez surveiller, exécutez CREATE
query :
Aucune création d’extension requise pour auto_explain
, uniquement pour pg_stat_statements
psql
postgres=# \c mydatabase
mydatabase=# CREATE EXTENSION pg_stat_statements;
Dans la section OPTIONS personnalisées de postgresql.conf
, ajoutez les lignes :
pg_stat_statements.max = 5000
pg_stat_statements.track = all
pg_stat_statements.save = on
Redémarrer le service postgresql
Exemple : Obtenir les 5 requêtes les plus coûteuses dans les bases de données
SELECT query, calls, total_time, rows, 100.0\*shared_blks_hit/nullif(shared_blks_hit+shared_blks_read,0) AS hit_percent
from pg_stat_statements as s inner join pg_database as d on d.oid = s.dbid
where d.datname = 'Database_Name'
order by total_time desc limit 5;