next up previous
suivant: Optimiser les requêtes monter: optimisation précédent: Avec plusieurs tables

Les statistiques utilisées par le SGBD

Les informations sont de deux ordres :

Exemple : Les premières informations se trouvent dans la table pg_class :

base_test=# select relname, relkind, reltuples, relpages 
from pg_class 
where relname like 'element_enseignement%';
             relname              | relkind | reltuples | relpages
----------------------------------+---------+-----------+----------
 element_enseignement_pkey        | i       |       515 |        4
 element_enseignement_code_ee_key | i       |       515 |        4
 element_enseignement             | r       |       515 |        6
(3 lignes)

Ici, on voit que la table element_enseignement contient 515 enregistrements (et ses index 515 entrées!), et qu'elle est répartie sur 6 pages, tandis qu'il suffit de 4 pages pour stocker chacun de ses deux index (une entrée d'index est bien plus petite qu'un enregistrement de la table).

Ces informations ne sont pas tenues à jour à chaque modification d'une table (ce n'est pas nécessaire, et c'est beaucoup plus efficace). Elles est mise à jour par les commandes vacuum, analyze et create index. analyze est une commande dont l'objet est de collecter les statistiques sur la base. Elle peut être appelée sans paramètre, et alors analyse toute la base, ou bien avec un nom de table, ou bien un nom de table et des noms d'attributs et alors n'analyse que ces éléments. vacuum déclenche le garbage-collector.Il est recommande de l'utiliser accompagné de la commande analyze.

La seconde catégorie d'information se trouve dans la table pg_statistics mais plus couramment vous utiliserez la vue associée pg_stats. pg_statistics est mis à jour par les commandes vacuum analyze et analyze, mais il s'agit toujours d'informations approximatives.

Exemple :

base_test=# select most_common_vals, most_common_freqs,
histogram_bounds 
from pg_stats where tablename='ue_ee';
 most_common_vals | most_common_freqs | histogram_bounds 
------------------+-------------------+------------------
(0 lignes)

base_test=# vacuum analyze;
VACUUM
base_test=# select attname, most_common_vals, most_common_freqs
from pg_stats where tablename='ue_ee' 
and not (attname like 'id_%');
         attname         |   most_common_vals   |   most_common_freqs
-------------------------+----------------------+----------------------------
 maj_auto                | {t,f}                | {0.740806,0.259194}
 nb_gpe                  | {1,0,2}              | {0.553415,0.189142,0.134851}
(4 lignes)

base_test=# \d pg_stats
         View "pg_catalog.pg_stats"
      Colonne      |  Type   | Modifications
-------------------+---------+---------------
 schemaname        | name    |
 tablename         | name    |
 attname           | name    |
 null_frac         | real    |
 avg_width         | integer |
 n_distinct        | real    |
 most_common_vals  | text[]  |
 most_common_freqs | real[]  |
 histogram_bounds  | text[]  |
 correlation       | real    |

null_frac donne le pourcentage d'enregistrements dont la valeur est nulle, n_distinct donne des informations sur le nombre de valeurs distinctes, correlation donne une information sur le tri de la table sur cet attribut (utile pour les index).


next up previous
suivant: Optimiser les requêtes monter: optimisation précédent: Avec plusieurs tables
Anne 2006-12-13