PostgreSQLLa base de données la plus sophistiquée au monde.
Documentation PostgreSQL 17.6 » Annexes » Modules et extensions supplĂ©mentaires fournis » pg_stat_statements -- rĂ©cupĂ©rer les statistiques de planification et d'exĂ©cution de requĂȘtes SQL

F.30. pg_stat_statements -- rĂ©cupĂ©rer les statistiques de planification et d'exĂ©cution de requĂȘtes SQL #

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.

F.30.1. La vue 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

userid oid (référence pg_authid.oid)

OID de l'utilisateur qui a exĂ©cutĂ© la requĂȘte

dbid oid (référence pg_database.oid)

OID de la base dans laquelle a Ă©tĂ© exĂ©cutĂ©e la requĂȘte

toplevel bool

True si la requĂȘte a Ă©tĂ© exĂ©cutĂ©e comme instruction de haut niveau (toujours true si pg_stat_statements.track est configurĂ© Ă  top)

queryid bigint

Code de hachage, calculĂ© Ă  partir de l'arbre d'analyse de la requĂȘte

query text

Texte d'une requĂȘte reprĂ©sentative

plans bigint

Nombre d'optimisations de la requĂȘte (si pg_stat_statements.track_planning est activĂ©, sinon zĂ©ro)

total_plan_time double precision

DurĂ©e totale passĂ©e Ă  optimiser la requĂȘte, en millisecondes (si pg_stat_statements.track_planning est activĂ©, sinon zĂ©ro)

min_plan_time double precision

DurĂ©e minimale passĂ©e Ă  optimiser la requĂȘte, en millisecondes. Ce champ vaudra zĂ©ro si pg_stat_statements.track_planning est dĂ©sactivĂ© ou si le compteur a Ă©tĂ© rĂ©initialisĂ© en utilisant la fonction pg_stat_statements_reset avec le paramĂštre minmax_only initialisĂ© Ă  true et que la requĂȘte n'a pas Ă©tĂ© exĂ©cutĂ©e depuis.

max_plan_time double precision

DurĂ©e maximale passĂ©e Ă  optimiser la requĂȘte, en millisecondes. Ce champ vaudra zĂ©ro si pg_stat_statements.track_planning est dĂ©sactivĂ© ou si le compteur a Ă©tĂ© rĂ©initialisĂ© en utilisant la fonction pg_stat_statements_reset avec le paramĂštre minmax_only initialisĂ© Ă  true et que la requĂȘte n'a pas Ă©tĂ© exĂ©cutĂ©e depuis.

mean_plan_time double precision

DurĂ©e moyenne passĂ©e Ă  optimiser la requĂȘte, en millisecondes (si pg_stat_statements.track_planning est activĂ©, sinon zĂ©ro)

stddev_plan_time double precision

DĂ©viation standard de la durĂ©e passĂ©e Ă  optimiser la requĂȘte, en millisecondes (si pg_stat_statements.track_planning est activĂ©, sinon zĂ©ro)

calls bigint

Nombre d'exĂ©cutions de la requĂȘte

total_exec_time double precision

DurĂ©e totale passĂ©e Ă  exĂ©cuter la requĂȘte, en millisecondes

min_exec_time double precision

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 pg_stat_statements_reset avec le paramĂštre minmax_only initialisĂ© Ă  true

max_exec_time double precision

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 pg_stat_statements_reset avec le paramĂštre minmax_only initialisĂ© Ă  true

mean_exec_time double precision

DurĂ©e moyenne passĂ©e Ă  exĂ©cuter la requĂȘte, en millisecondes

stddev_exec_time double precision

DĂ©viation standard de la durĂ©e passĂ©e Ă  exĂ©cuter la requĂȘte, en millisecondes

rows bigint

Nombre total de lignes rĂ©cupĂ©rĂ©es ou affectĂ©es par la requĂȘte

shared_blks_hit bigint

Nombre total de blocs lus dans le cache partagĂ© par la requĂȘte

shared_blks_read bigint

Nombre total de blocs lus hors cache partagĂ© par la requĂȘte

shared_blks_dirtied bigint

Nombre total de blocs modifiĂ©s dans le cache partagĂ© par la requĂȘte

shared_blks_written bigint

Nombre total de blocs du cache partagĂ© Ă©crit sur disque par la requĂȘte

local_blks_hit bigint

Nombre total de blocs lus dans le cache local par la requĂȘte

local_blks_read bigint

Nombre total de blocs lus hors du cache local par la requĂȘte

local_blks_dirtied bigint

Nombre total de blocs modifiĂ©s dans le cache local par la requĂȘte

local_blks_written bigint

Nombre total de blocs du cache local Ă©crit sur disque par la requĂȘte

temp_blks_read bigint

Nombre total de blocs lus dans les fichiers temporaires par la requĂȘte

temp_blks_written bigint

Nombre total de blocs Ă©crits dans les fichiers temporaires par la requĂȘte

shared_blk_read_time double precision

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)

shared_blk_write_time double precision

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)

local_blk_read_time double precision

Durale totale de lecture de blocs locaux, en millisecondes (si track_io_timing est activé, sinon zéro)

local_blk_write_time double precision

Durale totale d'écriture de blocs locaux, en millisecondes (si track_io_timing est activé, sinon zéro)

temp_blk_read_time double precision

Durée totale des lectures des blocs de fichiers temporaires en millisecondes (si track_io_timing est activé, sinon zéro)

temp_blk_write_time double precision

Durée totale des écritures des blocs de fichiers temporaires en millisecondes (si track_io_timing est activé, sinon zéro)

wal_records bigint

Nombre total d'enregistrements gĂ©nĂ©rĂ©s dans les WAL par la requĂȘte

wal_fpi bigint

Nombre total d'images complĂštes de blocs (full page images) gĂ©nĂ©rĂ©s dans les WAL par la requĂȘte

wal_bytes numeric

Nombre total d'octets gĂ©nĂ©rĂ©s dans les WAL par la requĂȘte

jit_functions bigint

Nombre total de fonctions compilĂ©es par JIT pour cette requĂȘte

jit_generation_time double precision

DurĂ©e totale passĂ©e par la requĂȘte sur la gĂ©nĂ©ration de code JIT, en millisecondes

jit_inlining_count bigint

Nombre de fois oĂč les fonctions ont Ă©tĂ© incluses

jit_inlining_time double precision

DurĂ©e totale passĂ©e par la requĂȘte sur l'inclusion de fonctions, en millisecondes

jit_optimization_count bigint

Nombre de fois oĂč la requĂȘte a Ă©tĂ© optimisĂ©e

jit_optimization_time double precision

DurĂ©e totale passĂ©e sur l'optimisation de la requĂȘte, en millisecondes

jit_emission_count bigint

Nombre de fois oĂč du code a Ă©tĂ© Ă©mis

jit_emission_time double precision

DurĂ©e totale passĂ©e par la requĂȘte sur de l'Ă©mission de code, en millisecondes

jit_deform_count bigint

Nombre total de fonctions deform de lignes pour le code compilĂ© par JIT pour la requĂȘte

jit_deform_time double precision

DurĂ©e totale passĂ©e par la requĂȘte sur les fonctions deform pour le code compilĂ© par JIT, en millisecondes

stats_since timestamp with time zone

Moment Ă  partir duquel les statistiques ont commencĂ© Ă  ĂȘtre rĂ©cupĂ©rĂ©es pour cette requĂȘte

minmax_stats_since timestamp with time zone

Moment Ă  partir duquel les statistiques min/max ont commencĂ© Ă  ĂȘtre rĂ©cupĂ©rĂ©es pour cette requĂȘte (champs min_plan_time, max_plan_time, min_exec_time et max_exec_time)


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.

Note

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.

F.30.2. La vue 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

dealloc bigint

Nombre total de fois oĂč les enregistrements de pg_stat_statements pour les requĂȘtes les moins exĂ©cutĂ©es ont Ă©tĂ© dĂ©sallouĂ©es parce que plus de pg_stat_statements.max requĂȘtes distinctes ont Ă©tĂ© observĂ©es

stats_reset timestamp with time zone

Horodatage de la derniÚre réinitialisation de toutes les statistiques de pg_stat_statements.


F.30.3. Fonctions #

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.

F.30.4. ParamĂštres de configuration #

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
  

F.30.5. Exemple de sortie #

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     |

  

F.30.6. Auteurs #

Takahiro Itagaki . La normalisation des requĂȘtes a Ă©tĂ© ajoutĂ©e par Peter Geoghegan .