23.2. Le r�cup�rateur de statistiques

Le r�cup�rateur de statistiques de PostgreSQL est un sous-syst�me qui supporte la r�cup�ration et les rapports d'informations sur l'activit� du serveur. Actuellement, le r�cup�rateur peut compter les acc�s aux tables et index � la fois en terme de blocs disque et de lignes individuelles. Il supporte aussi la d�termination de la commande exacte en cours d'ex�cution par les autres processus serveur.

23.2.1. Configuration de la r�cup�ration de statistiques

Comme la r�cup�ration de statistiques ajoute un temps suppl�mentaire � l'ex�cution de la requ�te, le syst�me peut �tre configur� pour r�cup�rer ou non des informations. Ceci est contr�l� par les param�tres de configuration qui sont normalement initialis�s dans postgresql.conf. (Voir Section 16.4 pour plus de d�tails sur leur initialisation.)

Le param�tre stats_start_collector doit valoir true pour que le r�cup�rateur de statistiques soit seulement lanc�. C'est la valeur par d�faut et la configuration recommand�e mais elle peut �tre d�sactiv�e si vous n'�tes pas int�ress� dans les statistiques et que vous souhaitez supprimer toute activit� en trop. (N�anmoins, ce que vous sauverez sera assez petit.) Notez que cette option ne peut pas �tre chang�e alors que le serveur est en cours d'ex�cution.

Les param�tres stats_command_string, stats_block_level et stats_row_level contr�lent la quantit� d'informations r�ellement envoy�e au r�cup�rateur et d�termine du coup le temps suppl�mentaire r�clam�. Ils d�terminent respectivement si un processus serveur envoie sa cha�ne de commande actuelle, les statistiques d'acc�s au niveau du bloc disque et celles au niveau de la ligne vers le r�cup�rateur. Normalement, ces param�tres sont configur�s dans postgresql.conf de fa�on � ce qu'ils s'appliquent � tous les processus serveur mais il est possible de les activer/d�sactiver sur des sessions individuelles en utilisant la commande SET. (Pour emp�cher les utilisateurs ordinaires de cacher leur activit� � l'administrateur, seuls les superutilisateurs sont autoris�s � modifier ces param�tres avec SET.)

Note�: Comme les param�tres stats_command_string, stats_block_level et stats_row_level valent par d�faut false, tr�s peu de statistiques sont r�cup�r�es dans la configuration par d�faut. Activer une ou plus des variables de configuration am�liorera significativement le nombre de donn�es utiles produit par le r�cup�rateur de statistiques au prix d'une surcharge suppl�mentaire � l'ex�cution.

23.2.2. Visualiser les statistiques r�cup�r�es

Plusieurs vues pr�d�finies sont disponibles pour afficher les r�sultats de la r�cup�ration de statistiques, list�s dans Tableau 23-1. Autrement, vous pouvez construire des vues personnalis�es en utilisant les fonctions statistiques existantes.

En utilisant les statistiques pour surveiller l'activit� en cours, il est important de r�aliser que l'information n'est pas mise � jour instantan�ment. Chaque processus serveur individuel transmet le nouveau nombre d'acc�s au r�cup�rateur juste avant l'attente d'une nouvelle commande du client ; donc une requ�te toujours en cours n'affecte pas les totaux affich�s. De plus, le r�cup�rateur lui-m�me �met les nouveaux totaux une fois par pgstat_stat_interval millisecondes (500 par d�faut). Donc, les totaux affich�s sont bien derri�re l'activit� r�elle.

Un autre point important est que, lorsqu'un processus serveur se voit demander d'afficher une des statistiques, il r�cup�re tout d'abord les totaux les plus r�cents �mis pas le processus de r�cup�ration, puis continue d'utiliser cette image de toutes les vues et fonctions statistiques jusqu'� la fin de sa transaction en cours. Donc, les statistiques ne sembleront pas changer tant que vous restez dans la m�me transaction. Ceci est une fonctionnalit�, et non pas un bogue, car il vous permet de traiter plusieurs requ�tes sur les statistiques et de corr�ler les r�sultats sans vous inqui�ter que les nombres aient pu changer. Mais si vous voulez voir les nouveaux r�sultats pour chaque requ�te, assurez-vous de lancer les requ�tes en dehors de tout bloc de transaction.

Tableau 23-1. Vues statistiques standards

Nom de la vueDescription
pg_stat_activityUne ligne par processus serveur, affichant l'ID du processus, la base de donn�es, l'utilisateur, la requ�te en cours et le temps o� a commenc� l'ex�cution de la requ�te. Les colonnes renvoyant des donn�es sur la requ�te en cours sont seulement disponibles si le param�tre stats_command_string a �t� activ�. De plus, ces colonnes se lisent comme NULL sauf si l'utilisateur examinant cette vue est un superutilisateur ou est le propri�taire du processus en cours de rapport. (Notez qu'� cause des d�lais du r�cup�rateur, la requ�te en cours ne sera mise � jour que pour les requ�tes de longue dur�e.)
pg_stat_databaseUne ligne par base de donn�es, affichant le nombre de processus serveur actifs, le nombre total de transactions valid�es et le nombre de celles qui ont �t� annul�es, le nombre total de blocs disque lus et le nombre total de succ�s du tampon (c'est-�-dire le nombre de lectures de blocs �vit�es en trouvant d�j� le bloc dans le cache du tampon).
pg_stat_all_tablesPour chaque table dans la base de donn�es en cours, les nombres totaux de parcours s�quentiels et index�s, le nombre total de lignes renvoy�s par chaque type de parcours et le nombre total d'insertions, de mises � jour et de suppressions de lignes.
pg_stat_sys_tablesIdentique � pg_stat_all_tables, sauf que seules les tables syst�mes sont affich�es.
pg_stat_user_tablesIdentique � pg_stat_all_tables, sauf que seules les tables utilisateurs sont affich�es.
pg_stat_all_indexesPour chaque index dans la base de donn�es en cours, le nombre total de parcours d'index qui ont utilis� cet index, le nombre de lignes d'index lus et le nombre de lignes d'en-t�te r�cup�r�es avec succ�s. (Ceci pourrait �tre moindre quand les entr�es d'index pointent vers des lignes supprim�es.)
pg_stat_sys_indexesIdentique � pg_stat_all_indexes, sauf que seules les tables syst�mes sont affich�es.
pg_stat_user_indexesIdentique � pg_stat_all_indexes, sauf que seules les tables utilisateurs sont affich�es.
pg_statio_all_tablesPour chaque table de la base de donn�es en cours, le nombre total de lecture de blocs disques � partir de cette table, le nombre de r�cup�rations valides par les tampons, le nombre de lectures de blocs disque et le nombre de r�cup�rations valides par les tampons dans tous les index de cette table, le nombre de lectures de blocs disque et le nombre de r�cup�rations valides par les tampons dans tous les index � partir de la table auxiliaire TOAST (si elle existe) pour cette table, le nombre de lectures de blocs disque et le nombre de r�cup�rations valides par les tampons pour l'index de la table TOAST.
pg_statio_sys_tablesIdentique � pg_statio_all_tables, sauf que seules les tables syst�mes sont affich�es.
pg_statio_user_tablesIdentique � pg_statio_all_tables, sauf que seules les tables utilisateur sont affich�es.
pg_statio_all_indexesPour chaque index de la base de donn�es en cours, les nombres de lectures de blocs disque et de r�cup�rations valides dans cet index.
pg_statio_sys_indexesIdentique � pg_statio_all_indexes, sauf que seuls les index syst�mes sont affich�s.
pg_statio_user_indexesIdentique � pg_statio_all_indexes, sauf que seuls les index utilisateur sont affich�s.
pg_statio_all_sequencesPour chaque objet s�quence de la base de donn�es en cours, le nombres de lectures de blocs disque et de r�cup�rations valides de tampons dans cette s�quence.
pg_statio_sys_sequencesIdentique � pg_statio_all_sequences, sauf que seules les s�quences syst�me sont affich�es (actuellement, aucune s�quence syst�me n'est d�finie, donc cette vue est toujours vide)
pg_statio_user_sequencesIdentique � pg_statio_all_sequences, sauf que seules les s�quences utilisateur sont affich�es.

Les statistiques par index sont particuli�rement utiles pour d�terminer les index utilis�s et leur efficacit�.

Les vues pg_statio_ sont principalement utiles pour d�terminer l'efficacit� du cache tampon. Quand le nombre de lectures disques r�elles est plus petit que le nombre de r�cup�rations valides par le tampon, alors le cache satisfait la plupart des demandes de lecture sans faire appel au noyau. N�anmoins, ces statistiques ne nous donnent pas l'histoire compl�te : � cause de la fa�on dont PostgreSQL g�re les entr�es/sorties disque, les donn�es qui ne sont pas dans le tampon de PostgreSQL pourraient toujours r�sider dans le tampon d'entr�es/sorties du noyau et pourraient, du coup, �tre toujours r�cup�r�es sans n�cessiter une lecture physique. Les utilisateurs int�ress�s pour obtenir des informations plus d�taill�es sur le comportement des entr�es/sorties dans PostgreSQL sont invit�s � utiliser le r�cup�rateur de statistiques de PostgreSQL avec les outils du syst�me d'exploitation permettant une vue de la gestion des entr�es/sorties par le noyau.

Il existe d'autres fa�ons de regarder les statistiques. Cela se fait en �crivant des requ�tes qui utilisent les m�mes fonctions d'acc�s aux statistiques que les vues standards. Ces fonctions sont list�es dans le Tableau 23-2. Les fonctions d'acc�s par base de donn�es prennent un OID de la base de donn�es comme argument pour identifier la base de donn�es du rapport. Les fonctions par table et par index prennent l'OID de la table ou de l'index (notez que seuls les tables et les index de la base de donn�es en cours peuvent �tre vus par ces fonctions). Les fonctions d'acc�s au processus prennent le num�ro d'identifiant du processus.

Tableau 23-2. Fonctions d'acc�s aux statistiques

FonctionCode de retourDescription
pg_stat_get_db_numbackends(oid)integer Nombre de processus actifs pour la base de donn�es
pg_stat_get_db_xact_commit(oid)bigint Transactions valid�es dans la base de donn�es
pg_stat_get_db_xact_rollback(oid)bigint Transactions annul�es dans la base de donn�es
pg_stat_get_db_blocks_fetched(oid)bigint Nombre de demandes de r�cup�rations de blocs disque pour la base de donn�es
pg_stat_get_db_blocks_hit(oid)bigint Nombre de demandes de r�cup�rations de blocs disque trouv�s dans le tampon pour la base de donn�es
pg_stat_get_numscans(oid)bigint Nombre de parcours s�quentiels r�alis�s lorsque l'argument est une table, ou nombre de parcours d'index lorsque l'argument est un index
pg_stat_get_tuples_returned(oid)bigint Nombre de lignes lues par les parcours s�quentiels lorsque l'argument est une table, ou nombre de lignes d'index lues lorsque l'argument est un index
pg_stat_get_tuples_fetched(oid)bigint Nombre de lignes r�cup�r�es valides (non expir�es) r�cup�r�es par des parcours s�quentiels quand l'argument est une table, ou r�cup�r�es par des parcours d'index en utilisant cet index lorsque l'argument est un index
pg_stat_get_tuples_inserted(oid)bigint Nombre de lignes ins�r�es dans la table
pg_stat_get_tuples_updated(oid)bigint Nombre de lignes mises � jour dans la table
pg_stat_get_tuples_deleted(oid)bigint Nombre de lignes supprim�es dans la table
pg_stat_get_blocks_fetched(oid)bigint Nombre de demandes de r�cup�ration de blocs disques pour la table ou l'index
pg_stat_get_blocks_hit(oid)bigint Nombre de demandes de blocs disque r�cup�r�s dans le tampon pour la table ou l'index
pg_stat_get_backend_idset()set of integer Ensemble d'identifiants de processus actifs (de 1 au nombre de processus actifs). Voir l'exemple d'utilisation dans le texte.
pg_backend_pid()integer ID du processus pour le processus serveur attach� � la session en cours
pg_stat_get_backend_pid(integer)integer ID du processus pour le processus serveur donn�
pg_stat_get_backend_dbid(integer)oid ID de la base de donn�es pour le processus serveur en cours
pg_stat_get_backend_userid(integer)oid ID de l'utilisateur pour le processus serveur en cours
pg_stat_get_backend_activity(integer)text Commande active du processus serveur en cours (NULL si l'utilisateur courant n'est pas un superutilisateur ni le m�me utilisateur que celui de la session en cours de requ�tage, ou si stats_command_string n'est pas activ�e)
pg_stat_get_backend_activity_start(integer)timestamp with time zone Le moment o� la requ�te en cours de traitement a �t� lanc�e (NULL si l'utilisateur courant n'est pas un superutilisateur ou s'il ne s'agit pas du m�me utilisateur que celui de la session qui a lanc� la requ�te ou si stats_command_string n'est pas actif)
pg_stat_reset()boolean R�initialise toutes les statistiques en cours

Note�: pg_stat_get_db_blocks_fetched moins pg_stat_get_db_blocks_hit donne le nombre d'appels lanc�s pour la table, l'index ou la base de donn�es ; mais le nombre r�el de lectures physiques est habituellement moindre � cause des tampons du noyau.

La fonction pg_stat_get_backend_idset fournit un moyen agr�able de g�n�rer une ligne pour chaque processus serveur actif. Par exemple, pour afficher les PID et les requ�tes en cours pour tous les processus serveur :

SELECT pg_stat_get_backend_pid(s.backendid) AS procpid,
       pg_stat_get_backend_activity(s.backendid) AS current_query
    FROM (SELECT pg_stat_get_backend_idset() AS backendid) AS s;