Statistiques plus complètes
pg_stat_statements
est désormais capable de
comptabiliser les lignes lues ou affectées par les commandes
CREATE TABLE AS
, SELECT INTO
,
CREATE MATERIALIZED VIEW
,
REFRESH MATERIALIZED VIEW
et FETCH
.
Le script SQL suivant permet d’illustrer cette nouvelle
fonctionnalité. Il effectue plusieurs de ces opérations après avoir
réinitialisé les statistiques de pg_stat_statements
.
SELECT pg_stat_statements_reset();
CREATE TABLE pg_class_1 AS SELECT * FROM pg_class;
SELECT * INTO pg_class_2 FROM pg_class;
CREATE MATERIALIZED VIEW pg_class_3 AS SELECT * FROM pg_class;
REFRESH MATERIALIZED VIEW pg_class_3;
On retrouve bien le nombre de lignes affectées par les requêtes, dans
le champ rows
de la vue
pg_stat_statements
.
SELECT query , rows FROM pg_stat_statements;
query | rows
---------------------------------------------------------------+------
select * into pg_class_2 FROM pg_class | 401
select pg_stat_statements_reset() | 1
refresh materialized view pg_class_3 | 410
create materialized view pg_class_3 as select * from pg_class | 404
create table pg_class_1 as select * from pg_class | 398
Le même scénario de test réalisé en version 13 ne donne pas ces
informations.
SELECT query , rows FROM pg_stat_statements;
query | rows
---------------------------------------------------------------+------
select * into pg_class_2 FROM pg_class | 0
refresh materialized view pg_class_3 | 0
select pg_stat_statements_reset() | 1
create table pg_class_1 as select * from pg_class | 0
create materialized view pg_class_3 as select * from pg_class | 0
La vue pg_stat_statements_info
Une nouvelle vue pg_stat_statements_info
est ajoutée
pour tracer les statistiques du module lui-même.
\d pg_stat_statements_info;
View "public.pg_stat_statements_info"
Column | Type | Collation | Nullable | Default
-------------+--------------------------+-----------+----------+---------
dealloc | bigint | | |
stats_reset | timestamp with time zone | | |
La colonne stats_reset
rapporte la date de la dernière
réinitialisation des statistiques par la fonction
pg_stat_statements_reset()
.
La colonne dealloc
décompte les événements de purge qui
sont déclenchés lorsque le nombre de requêtes distinctes dépasse le
seuil défini par le paramètre pg_stat_statements.max
. Elle
sera particulièrement utile pour configurer ce paramètre. En effet, si
pg_stat_statements.max
est trop bas, des purges trop
fréquentes peuvent avoir un impact négatif sur les performances.
Sur une instance en version 14 avec
pg_stat_statement.max
configuré à une valeur basse de 100,
des requêtes distinctes sont exécutées via un script après une
réinitialisation des statistiques de pg_stat_statements
,
afin de provoquer un dépassement volontaire du seuil :
psql -d ws14 -c "select pg_stat_statements_reset();"
for rel_id in { 0 .. 200 } ; do
psql -d ws14 -c "create table pg_rel_ ${rel_id} (id int)" ;
psql -d ws14 -c "drop table pg_rel_ ${rel_id} " ;
done
La vue pg_stat_statements
a bien conservé un nombre de
requêtes inférieur à pg_stat_statement.max
, bien que 400
requêtes distinctes aient été exécutées :
SELECT count (* ) FROM pg_stat_statements;
Le nombre d’exécution de la purge de pg_stat_statements
est désormais tracé dans la vue pg_stat_statements_info
.
Elle a été déclenchée 31 fois pendant les créations et suppressions de
tables :
SELECT * FROM pg_stat_statements_info;
dealloc | stats_reset
---------+-------------------------------
31 | 2021-09-02 13:30:26.497678+02
Ces informations peuvent également être obtenues via la fonction du
même nom :
SELECT pg_stat_statements_info();
pg_stat_statements_info
--------------------------------------
( 31, "2021-09-02 13:35:22.457383+02" )
La nouvelle colonne toplevel
Une nouvelle colonne toplevel
apparaît dans la vue
pg_stat_statements
. Elle est de type booléen et précise si
la requête est directement exécutée ou bien exécutée au sein d’une
fonction. Le traçage des exécutions dans les fonctions n’est possible
que si le paramètre pg_stat_statements.track
est Ã
all
.
Sur une instance en version 14 avec
pg_stat_statement.track
configuré à all
, une
fonction simple contenant une seule requête SQL est créée. Elle permet
de retrouver le nom d’une relation à partir de son oid
.
CREATE OR REPLACE FUNCTION f_rel_name(oid int ) RETURNS varchar (32 ) AS
$$
SELECT relname FROM pg_class WHERE oid = $1 ;
$$
LANGUAGE SQL;
Après avoir réinitialisé les statistiques de
pg_stat_statements
, le nom d’une table est récupérée depuis
son oid
en utilisant une requête SQL directement, puis via
la fonction f_rel_name
 :
SELECT pg_stat_statements_reset();
SELECT relname FROM pg_class WHERE oid = 26140 ;
SELECT f_rel_name(26140 );
La vue pg_stat_statements
est consultée directement
après :
SELECT query , toplevel FROM pg_stat_statements
WHERE query NOT LIKE '%pg_stat_statements%'
ORDER BY query ;
query | toplevel
-------------------------------------------+----------
select f_rel_name( $1 ) | t
select relname from pg_class where oid=$1 | f
select relname from pg_class where oid=$1 | t
On retrouve bien l’appel de la fonction, ainsi que les deux
exécutions de la requête sur pg_class
, celle faite
directement, et celle faite au sein de la fonction
f_rel_name
. La requête dont toplevel
vaut
false
correspond à l’exécution dans la fonction. Il n’était
pas possible dans une version antérieure de distinguer aussi nettement
les deux contextes d’exécution.