Le module pg_stat_statements
fournit un moyen de
surveiller les statistiques d'optimisation et d'exécution de tous les
ordres SQL exécutés par un serveur.
Le module doit ĂȘtre chargĂ© par l'ajout de
pg_stat_statements
Ă shared_preload_libraries dans le fichier de configuration
postgresql.conf
parce qu'il a besoin de mémoire
partagée supplémentaire. Ceci signifie qu'il faut redémarrer le serveur
pour ajouter ou supprimer le module. De plus, le calcul de l'identifiant de
requĂȘte doit ĂȘtre activĂ© pour que le module soit actif, ce qui est fait
automatiquement si compute_query_id est configurĂ© Ă
auto
ou on
, ou tout autre module
tiers chargĂ© qui calcule les identifiants de requĂȘte.
Quand pg_stat_statements
est actif, il récupÚre des
statistiques sur toutes les bases de données du serveur. Pour y accéder et
les manipuler, le module fournit les vues
pg_stat_statements
et
pg_stat_statements_info
, et les fonctions
pg_stat_statements_reset
et
pg_stat_statements
. Elles ne sont pas disponibles
globalement mais peuvent ĂȘtre activĂ©es pour une base de donnĂ©es spĂ©cifique
avec l'instruction CREATE EXTENSION pg_stat_statements
.
pg_stat_statements
#
Les statistiques collectées par le module sont rendues disponibles par une
vue nommée pg_stat_statements
. Cette vue contient
une ligne pour chaque combinaison d'un identifiant de base de données,
d'un identifiant utilisateur, d'un identifiant de requĂȘte et s'il s'agit
d'une requĂȘte principale ou non (jusqu'au nombre maximum d'ordres
distincts que le module peut surveiller). Les colonnes de la vue sont
affichées dans Tableau F.21.
Tableau F.21. Colonnes de pg_stat_statements
Type de colonne Description |
---|
OID de l'utilisateur qui a exĂ©cutĂ© la requĂȘte |
OID de la base dans laquelle a Ă©tĂ© exĂ©cutĂ©e la requĂȘte |
True si la requĂȘte a Ă©tĂ© exĂ©cutĂ©e comme instruction de haut niveau
(toujours true si |
Code de hachage, calculĂ© Ă partir de l'arbre d'analyse de la requĂȘte |
Texte d'une requĂȘte reprĂ©sentative |
Nombre d'optimisations de la requĂȘte
(si |
DurĂ©e totale passĂ©e Ă optimiser la requĂȘte, en millisecondes
(si |
DurĂ©e minimale passĂ©e Ă optimiser la requĂȘte, en millisecondes. Ce
champ vaudra zéro si
|
DurĂ©e maximale passĂ©e Ă optimiser la requĂȘte, en millisecondes. Ce
champ vaudra zéro si
|
DurĂ©e moyenne passĂ©e Ă optimiser la requĂȘte, en millisecondes
(si |
DĂ©viation standard de la durĂ©e passĂ©e Ă optimiser la requĂȘte, en
millisecondes
(si |
Nombre d'exĂ©cutions de la requĂȘte |
DurĂ©e totale passĂ©e Ă exĂ©cuter la requĂȘte, en millisecondes |
DurĂ©e minimale passĂ©e Ă exĂ©cuter la requĂȘte, en millisecondes.
Ce champ vaudra zĂ©ro jusqu'Ă ce que cette requĂȘte soit exĂ©cutĂ©e
pour la premiÚre fois aprÚs la réinitialisation réalisée par la
fonction |
DurĂ©e maximale passĂ©e Ă exĂ©cuter la requĂȘte, en millisecondes.
Ce champ vaudra zĂ©ro jusqu'Ă ce que cette requĂȘte soit exĂ©cutĂ©e
pour la premiÚre fois aprÚs la réinitialisation réalisée par la
fonction |
DurĂ©e moyenne passĂ©e Ă exĂ©cuter la requĂȘte, en millisecondes |
DĂ©viation standard de la durĂ©e passĂ©e Ă exĂ©cuter la requĂȘte, en millisecondes |
Nombre total de lignes rĂ©cupĂ©rĂ©es ou affectĂ©es par la requĂȘte |
Nombre total de blocs lus dans le cache partagĂ© par la requĂȘte |
Nombre total de blocs lus hors cache partagĂ© par la requĂȘte |
Nombre total de blocs modifiĂ©s dans le cache partagĂ© par la requĂȘte |
Nombre total de blocs du cache partagĂ© Ă©crit sur disque par la requĂȘte |
Nombre total de blocs lus dans le cache local par la requĂȘte |
Nombre total de blocs lus hors du cache local par la requĂȘte |
Nombre total de blocs modifiĂ©s dans le cache local par la requĂȘte |
Nombre total de blocs du cache local Ă©crit sur disque par la requĂȘte |
Nombre total de blocs lus dans les fichiers temporaires par la requĂȘte |
Nombre total de blocs Ă©crits dans les fichiers temporaires par la requĂȘte |
DurĂ©e totale de lecture des blocs des fichiers de donnĂ©es (hors cache) par la requĂȘte, en millisecondes (si track_io_timing est activĂ©, sinon zĂ©ro) |
DurĂ©e totale de l'Ă©criture des blocs des fichiers de donnĂ©es (hors cache) par la requĂȘte, en millisecondes (si track_io_timing est activĂ©, sinon zĂ©ro) |
Durale totale de lecture de blocs locaux, en millisecondes (si track_io_timing est activé, sinon zéro) |
Durale totale d'écriture de blocs locaux, en millisecondes (si track_io_timing est activé, sinon zéro) |
Durée totale des lectures des blocs de fichiers temporaires en millisecondes (si track_io_timing est activé, sinon zéro) |
Durée totale des écritures des blocs de fichiers temporaires en millisecondes (si track_io_timing est activé, sinon zéro) |
Nombre total d'enregistrements gĂ©nĂ©rĂ©s dans les WAL par la requĂȘte |
Nombre total d'images complĂštes de blocs (full page images) gĂ©nĂ©rĂ©s dans les WAL par la requĂȘte |
Nombre total d'octets gĂ©nĂ©rĂ©s dans les WAL par la requĂȘte |
Nombre total de fonctions compilĂ©es par JIT pour cette requĂȘte |
DurĂ©e totale passĂ©e par la requĂȘte sur la gĂ©nĂ©ration de code JIT, en millisecondes |
Nombre de fois oĂč les fonctions ont Ă©tĂ© incluses |
DurĂ©e totale passĂ©e par la requĂȘte sur l'inclusion de fonctions, en millisecondes |
Nombre de fois oĂč la requĂȘte a Ă©tĂ© optimisĂ©e |
DurĂ©e totale passĂ©e sur l'optimisation de la requĂȘte, en millisecondes |
Nombre de fois oĂč du code a Ă©tĂ© Ă©mis |
DurĂ©e totale passĂ©e par la requĂȘte sur de l'Ă©mission de code, en millisecondes |
Nombre total de fonctions deform de lignes pour le code compilĂ© par JIT pour la requĂȘte |
DurĂ©e totale passĂ©e par la requĂȘte sur les fonctions deform pour le code compilĂ© par JIT, en millisecondes |
Moment Ă partir duquel les statistiques ont commencĂ© Ă ĂȘtre rĂ©cupĂ©rĂ©es pour cette requĂȘte |
Moment Ă partir duquel les statistiques min/max ont commencĂ© Ă ĂȘtre
rĂ©cupĂ©rĂ©es pour cette requĂȘte (champs
|
Pour raisons de sécurité, seuls les superutilisateurs et les rÎles
disposant des droits du
rĂŽle pg_read_all_stats
sont autorisé à voir le texte
SQL ainsi que le champ queryid
des requĂȘtes
exécutées par d'autres utilisateurs. Les autres utilisateurs peuvent
cependant voir les statistiques, si la vue a été installée dans leur base
de données.
Les requĂȘtes qui disposent d'un plan d'exĂ©cution
(c'est-Ă -dire SELECT
, INSERT
,
UPDATE
, DELETE
et
MERGE
) et les commandes utilitaires sont combinées en
une entrée unique dans pg_stat_statements
lorsqu'elles ont un plan d'exécution similaire (d'aprÚs leur hachage). En
substance, cela signifie que deux requĂȘtes seront considĂ©rĂ©es comme
Ă©quivalentes si elles sont sĂ©mantiquement les mĂȘmes mais disposent de
valeurs littĂ©rales diffĂ©rentes dans la requĂȘte.
Les détails suivant sur le remplacement des constantes et le
queryid
s'appliquent seulement si compute_query_id est activé. Si vous utilisez un module
externe pour calculer queryid
, vous devez vous
référer à sa documentation pour les détails.
Quand la valeur d'une constante a été ignorée pour pouvoir comparer la
requĂȘte Ă d'autres requĂȘtes, la constante est remplacĂ©e par un symbole de
paramĂštre, tel que $1
, dans l'affichage de
pg_stat_statements
. Le reste du texte de la
requĂȘte est tel qu'Ă©tait la premiĂšre requĂȘte ayant la valeur de hashage
queryid
spécifique associée à l'entrée dans
pg_stat_statements
.
Les requĂȘtes sur lesquelles la normalisation peut ĂȘtre appliquĂ©e peuvent
ĂȘtre observĂ©es avec des valeurs constantes dans
pg_stat_statements
, principalement quand il y a
un taux élevé de désallocations d'entrées. Pour réduire ce risque, pensez
Ă augmenter pg_stat_statements.max
. La vue
pg_stat_statements_info
, discutée ci-dessous dans
Section F.30.2, fournit des
statistiques sur les désallocations d'entrées.
Dans certains cas, les requĂȘtes SQL avec des textes diffĂ©rents peuvent ĂȘtre
fusionnés en une seule entrée pg_stat_statements
.
Normalement, cela n'arrive que pour les requĂȘtes dont la sĂ©mantique est
équivalente, mais il y a une petite chance que des collisions de
l'algorithme de hachage aient pour consĂ©quence la fusion de requĂȘtes sans
rapport en une entrée. (Cela ne peut cependant pas arriver pour des
requĂȘtes appartenant Ă des utilisateurs diffĂ©rents ou des bases de donnĂ©es
différentes).
Puisque la valeur de hachage queryid
est
calculĂ©e sur la reprĂ©sentation de la requĂȘte aprĂšs analyse, l'inverse est
Ă©galement possible : des requĂȘtes avec un texte identique peuvent
apparaßtre comme des entrées séparées, si elles ont des significations
différentes en fonction de facteurs externes, comme des réglages de
search_path
différents.
Les programmes utilisant pg_stat_statements
pourraient préférer utiliser queryid
(peut-ĂȘtre
en association avec dbid
et
userid
) pour disposer d'un identifiant plus
stable et plus sĂ»r pour chaque entrĂ©e plutĂŽt que le texte de la requĂȘte.
Cependant, il est important de comprendre qu'il n'y a qu'une garantie
limitée sur la stabilité de la valeur de hachage de
queryid
. Puisque l'identifiant est dérivé de
l'arbre aprĂšs analyse, sa valeur est une fonction, entre autres choses, des
identifiants d'objet interne apparaissant dans cette représentation. Cela
a des implications paradoxales. Par exemple,
pg_stat_statements
considĂ©rera deux requĂȘtes
apparemment identiques comme distinctes, si elles référencent une table qui
a Ă©tĂ© supprimĂ©e et recréée entre l'exĂ©cution de ces deux requĂȘtes. Le
processus de hachage est également sensible aux différences d'architecture
des machines ainsi que d'autres facettes de la plateforme. De plus, il
n'est pas sûr de partir du principe que queryid
restera stable entre des versions majeures de
PostgreSQL.
Deux serveurs participant à une réplication basée sur le rejeu physique des
journaux de transactions devraient avoir des valeurs de
queryid
identiques pour la mĂȘme requĂȘte.
Cependant, les systÚmes de réplication logique ne promettent pas de conserver
des réplicas identiques surtout les détails intéressants, donc
queryid
ne sera pas un identifiant utile pour
accumuler les coûts dans un ensemble de réplicas logiques. En cas de doute,
un test direct est recommandé.
En rĂšgle gĂ©nĂ©ral, il peut ĂȘtre supposĂ© que les valeurs
queryid
sont stables entre des versions mineures
de PostgreSQL, en supposant que les instances sont
exĂ©cutĂ©es sur la mĂȘme architecture matĂ©rielle et que les dĂ©tails de
métadonnées du catalogue correspondent. La compatibilité entre versions
mineures ne sera cassée qu'en cas de derniÚre extrémité.
Le symbole de paramÚtre utilité pour remplacer les constantes dans le texte
reprĂ©sentatif de la requĂȘte dĂ©marre aprĂšs le plus grand paramĂštre
$
n
dans le texte de la
requĂȘte originale, ou $1
s'il n'y en avait pas. Il est
intéressant de noter que dans certains cas il pourrait y avoir un symbole de
paramÚtre caché qui affecte cette numérotation. Par exemple,
PL/pgSQL utilise des symbole de paramÚtre cachés
pour insérer des valeurs de variables locales à la fonction dans les
requĂȘtes, ainsi un ordre PL/pgSQL comme
SELECT i + 1 INTO j
aurait un texte représentatif tel
que SELECT i + $2
.
Les textes des requĂȘtes sont conservĂ©es dans un fichier texte externe et ne
consomment pas de mĂ©moire partagĂ©e. De ce fait, mĂȘme les textes trĂšs longs
de requĂȘtes peuvent ĂȘtre enregistrĂ©s avec succĂšs. NĂ©anmoins, si beaucoup de
textes trĂšs longs de requĂȘtes sont accumulĂ©es, le fichier externe peut
devenir suffisamment gros pour ne plus ĂȘtre gĂ©rable. Si cela survient,
comme méthode de restauration, pg_stat_statements
peut
choisir d'ignorer les textes de requĂȘtes. Dans ce cas, le champ
query
apparaitra vide sur les lignes de la vue
pg_stat_statements
mais les statistiques associées
seront préservées. Si cela arrive, réfléchissez à réduire la valeur du
paramĂštre pg_stat_statements.max
pour empĂȘcher que cela
ne recommence.
plans
et calls
peuvent différer car les statistiques d'optimisation/planification et
d'exécution sont mises à jours à leur fin respective, et seulement si elles
ont rĂ©ussi. Par exemple, si une requĂȘte est optimisĂ©e avec succĂšs mais
échoue sur la phase d'exécution, seules les statistiques
d'optimisation/planification seront modifiées. Si
l'optimisation/planification est ignorée parce qu'un plan en cache est
utilisé, seules les statistiques d'exécution seront mises à jour.
pg_stat_statements_info
#
Les statistiques du module pg_stat_statements
lui-mĂȘme
sont tracées et rendues disponibles via une vue nommée
pg_stat_statements_info
. Cette vue contient une
seule ligne. Les colonnes de la vue sont affichées dans Tableau F.22.
Tableau F.22. Colonnes de pg_stat_statements_info
Type de colonne Description |
---|
Nombre total de fois oĂč les enregistrements de
|
Horodatage de la derniÚre réinitialisation de toutes les statistiques de
|
pg_stat_statements_reset(userid Oid, dbid Oid, queryid bigint, minmax_only boolean) returns void
pg_stat_statements_reset
annule les statistiques
récupérées jusqu'à maintenant par
pg_stat_statements
correspondant aux
userid
, dbid
et
queryid
indiqués. Si un de ces paramÚtres
n'est pas spécifié, la valeur par défaut 0
(invalide) est utilisée pour chacun d'entre eux et les statistiques qui
correspondent avec les autres paramÚtres seront réinitialisées. Si
aucun paramÚtre n'est spécifié ou si tous les paramÚtres spécifiés sont
Ă 0
(invalide), elle annulera toutes les
statistiques. Si toutes les statistiques de la vue
pg_stat_statements
sont annulées, cela va aussi
réinitialiser les statistiques de la vue
pg_stat_statements_info
. Quand
minmax_only
vaut true
,
seules les valeurs des durées minimales et maximales, d'optimisation
comme d'exécution, seront réinitialisées (c'est-à -dire les champs
min_plan_time
,
max_plan_time
,
min_exec_time
et
max_exec_time
fields). La valeur par défaut
du paramĂštre minmax_only
est
false
. Le moment oĂč ces statistiques ont Ă©tĂ©
réinitialisées est indiqué dans le champ
minmax_stats_since
de la vue
pg_stat_statements
. Cette fonction renvoie le
moment d'une réinitialisation. Ce moment est sauvegardé dans le champ
stats_reset
de la vue
pg_stat_statements_info
ou le champ
minmax_stats_since
de la vue
pg_stat_statements
si la réinitialisation
correspondante a été réellement effectuée. Par défaut, cette fonction
peut seulement ĂȘtre exĂ©cutĂ©e par les superutilisateurs. L'accĂšs peut
ĂȘtre donnĂ© Ă d'autres utilisateurs en utilisant la commande
GRANT
.
pg_stat_statements(showtext boolean) returns setof record
La vue pg_stat_statements
est basée sur une
fonction également nommée pg_stat_statements
. Les
clients peuvent appeler la fonction
pg_stat_statements
directement, et peuvent en
spécifiant showtext := false
ne pas récupérer le
texte de la requĂȘte (ce qui veut dire que l'argument
OUT
qui correspond Ă la colonne
query
de la vue retournera des NULL). Cette
fonctionnalité est prévue pour le support d'outils externes qui
pourraient vouloir éviter le surcoût de récupérer de maniÚre répétée
les textes des requĂȘtes de longueur indĂ©terminĂ©es. De tels outils
peuvent Ă la place eux-mĂȘme mettre le premier texte de requĂȘte rĂ©cupĂ©rĂ©
pour chaque entrée, puisque c'est déjà ce que fait
pg_stat_statements
lui-mĂȘme, et ensuite rĂ©cupĂ©rer
les textes de requĂȘtes uniquement si nĂ©cessaire. Puisque le serveur
stocke les textes de requĂȘte dans un fichier, cette approche pourrait
réduire les entrée/sorties physiques pour des vérifications répétées
des données de pg_stat_statements
.
pg_stat_statements.max
(integer
)
pg_stat_statements.max
est le nombre maximum d'ordres
tracés par le module (c'est-à -dire le nombre maximum de lignes dans la
vue pg_stat_statements
). Si un nombre
supérieur d'ordres SQL distincts a été observé, c'est l'information sur
les ordres les moins exĂ©cutĂ©s qui est ignorĂ©e. Le nombre de fois oĂč une
telle information est ignorée est consultable dans la vu
pg_stat_statements_info
. La valeur par défaut
est 5000. Ce paramĂštre peut uniquement ĂȘtre positionnĂ© au dĂ©marrage du
serveur.
pg_stat_statements.track
(enum
)
pg_stat_statements.track
contrĂŽle quels sont les
ordres comptabilisés par le module. Spécifiez top
pour suivre les ordres de plus haut niveau (ceux qui sont soumis
directement par les clients), all
pour suivre
également les ordres imbriqués (tels que les ordres invoqués dans les
fonctions) ou none
pour désactiver la récupération
des statistiques sur les requĂȘtes. La valeur par dĂ©faut est
top
. Seuls les superutilisateurs peuvent changer ce
paramétrage.
pg_stat_statements.track_utility
(boolean
)
pg_stat_statements.track_utility
contrĂŽle si les
commandes utilitaires sont tracées par le module. Les commandes
utilitaires sont toutes les commandes SQL sauf
SELECT
, INSERT
,
UPDATE
, DELETE
et
MERGE
. La valeur par
défaut est on
. Seuls les superutilisateurs peuvent
modifier cette configuration.
pg_stat_statements.track_planning
(boolean
)
pg_stat_statements.track_planning
contrĂŽle si les
opérations d'optimisation/planification et leur durée sont tracées par
ce module. Activer ce paramÚtre pourrait résulter en une perte visible
de performance, spĂ©cialement quand les requĂȘtes avec des structures
identiques sont exécutées par de nombreuses connexions concurrentes, ce
qui pousse à mettre à jour un petit nombre d'entrées de
pg_stat_statements
. La valeur par défaut est
off
. Seuls les superutilisateurs peuvent modifier
cette configuration.
pg_stat_statements.save
(boolean
)
pg_stat_statements.save
précise s'il faut sauvegarder
les statistiques lors des arrĂȘts du serveur. S'il est
off
, alors les statistiques ne sont pas sauvegardées
lors de l'arrĂȘt ni rechargĂ©es au dĂ©marrage du serveur. La valeur par
défaut est on
. Ce paramĂštre peut uniquement ĂȘtre
positionné dans le fichier postgresql.conf
ou sur
la ligne de commande du serveur.
Le module a besoin de mĂ©moire partagĂ©e supplĂ©mentaire proportionnelle Ă
pg_stat_statements.max
. Notez que cette mémoire est
consommĂ©e quand le module est chargĂ©, mĂȘme si
pg_stat_statements.track
est positionnĂ© Ă
none
.
Ces paramĂštres doivent ĂȘtre dĂ©finis dans
postgresql.conf
. Un usage courant pourrait ĂȘtre :
# postgresql.conf shared_preload_libraries = 'pg_stat_statements' compute_query_id = on pg_stat_statements.max = 10000 pg_stat_statements.track = all
bench=# SELECT pg_stat_statements_reset(); $ pgbench -i bench $ pgbench -c10 -t300 bench bench=# \x bench=# SELECT query, calls, total_exec_time, rows, 100.0 * shared_blks_hit / nullif(shared_blks_hit + shared_blks_read, 0) AS hit_percent FROM pg_stat_statements ORDER BY total_exec_time DESC LIMIT 5; -[ RECORD 1 ]---+--------------------------------------------------â------------------ query | UPDATE pgbench_branches SET bbalance = bbalance + $1 WHERE bid = $2 calls | 3000 total_exec_time | 25565.855387 rows | 3000 hit_percent | 100.0000000000000000 -[ RECORD 2 ]---+--------------------------------------------------â------------------ query | UPDATE pgbench_tellers SET tbalance = tbalance + $1 WHERE tid = $2 calls | 3000 total_exec_time | 20756.669379 rows | 3000 hit_percent | 100.0000000000000000 -[ RECORD 3 ]---+--------------------------------------------------â------------------ query | copy pgbench_accounts from stdin calls | 1 total_exec_time | 291.865911 rows | 100000 hit_percent | 100.0000000000000000 -[ RECORD 4 ]---+--------------------------------------------------â------------------ query | UPDATE pgbench_accounts SET abalance = abalance + $1 WHERE aid = $2 calls | 3000 total_exec_time | 271.232977 rows | 3000 hit_percent | 98.8454011741682975 -[ RECORD 5 ]---+--------------------------------------------------â------------------ query | alter table pgbench_accounts add primary key (aid) calls | 1 total_exec_time | 160.588563 rows | 0 hit_percent | 100.0000000000000000 bench=# SELECT pg_stat_statements_reset(0,0,s.queryid) FROM pg_stat_statements AS s WHERE s.query = 'UPDATE pgbench_branches SET bbalance = bbalance + $1 WHERE bid = $2'; bench=# SELECT query, calls, total_exec_time, rows, 100.0 * shared_blks_hit / nullif(shared_blks_hit + shared_blks_read, 0) AS hit_percent FROM pg_stat_statements ORDER BY total_exec_time DESC LIMIT 5; -[ RECORD 1 ]---+--------------------------------------------------â------------------ query | UPDATE pgbench_tellers SET tbalance = tbalance + $1 WHERE tid = $2 calls | 3000 total_exec_time | 20756.669379 rows | 3000 hit_percent | 100.0000000000000000 -[ RECORD 2 ]---+--------------------------------------------------â------------------ query | copy pgbench_accounts from stdin calls | 1 total_exec_time | 291.865911 rows | 100000 hit_percent | 100.0000000000000000 -[ RECORD 3 ]---+--------------------------------------------------â------------------ query | UPDATE pgbench_accounts SET abalance = abalance + $1 WHERE aid = $2 calls | 3000 total_exec_time | 271.232977 rows | 3000 hit_percent | 98.8454011741682975 -[ RECORD 4 ]---+--------------------------------------------------â------------------ query | alter table pgbench_accounts add primary key (aid) calls | 1 total_exec_time | 160.588563 rows | 0 hit_percent | 100.0000000000000000 -[ RECORD 5 ]---+--------------------------------------------------â------------------ query | vacuum analyze pgbench_accounts calls | 1 total_exec_time | 136.448116 rows | 0 hit_percent | 99.9201915403032721 bench=# SELECT pg_stat_statements_reset(0,0,0); bench=# SELECT query, calls, total_exec_time, rows, 100.0 * shared_blks_hit / nullif(shared_blks_hit + shared_blks_read, 0) AS hit_percent FROM pg_stat_statements ORDER BY total_exec_time DESC LIMIT 5; -[ RECORD 1 ]---+--------------------------------------------------â--------------------------- query | SELECT pg_stat_statements_reset(0,0,0) calls | 1 total_exec_time | 0.189497 rows | 1 hit_percent | -[ RECORD 2 ]---+--------------------------------------------------â--------------------------- query | SELECT query, calls, total_exec_time, rows, $1 * shared_blks_hit / + | nullif(shared_blks_hit + shared_blks_read, $2) AS hit_percent+ | FROM pg_stat_statements ORDER BY total_exec_time DESC LIMIT $3 calls | 0 total_exec_time | 0 rows | 0 hit_percent |
Takahiro Itagaki <itagaki.takahiro@oss.ntt.co.jp>
. La
normalisation des requĂȘtes a Ă©tĂ© ajoutĂ©e par Peter Geoghegan
<peter@2ndquadrant.com>
.