| Documentation PostgreSQL 7.2 | ||
|---|---|---|
| <<< Previous | Astuces de performance | Next >>> |
Ainsi que nous l'avons vu dans la section précédente, le planner de requête a besoin d'estimer le nombre de lignes retrouvées par une requête afin de faire les bons choix de plans de requête. Cette section est un aperçu rapide sur les statistiques que le système utilise pour ceci.
Un des composants des statistiques est le nombre total d'entrées dans chaque table et index, aussi bien que le nombre de blocks disques occupés par chaque table et index. Cette information est conservée dans les colonnes reltuples et relpages de pg_class. Nous pouvons le voir avec des requêtes similaires à celle-ci :
regression=# select relname, relkind, reltuples, relpages from pg_class
regression-# where relname like 'tenk1%';
relname | relkind | reltuples | relpages
---------------+---------+-----------+----------
tenk1 | r | 10000 | 233
tenk1_hundred | i | 10000 | 30
tenk1_unique1 | i | 10000 | 30
tenk1_unique2 | i | 10000 | 30
(4 rows) |
Pour des raisons d'efficacité, reltuples et relpages ne sont pas mis à jour à la volée, et ainsi contiennent seulement des valeurs approximatives. Elles sont initialisées avec des valeurs fantôme (1000 et 10 respectivement actuellement) quand une table est créée. Elles sont mises à jour par certaines commandes, actuellement VACUUM, ANALYZE, et CREATE INDEX. Un ANALYZE tout seul, qui est une partie de VACUUM, génère une valeur approximative reltuples depuis qu'il ne doit pas lire chaque ligne de la table.
La plupart des requêtes ne retrouvent qu'une partie des lignes d'une table, car les clauses WHERE restreignent le nombre de lignes à examiner. Ainsi le planner doit faire une estimation de la sélectivité des clauses WHERE, qui est, la partie des lignes qui apparient chaque clause de la condition WHERE. L'information utilisée pour cette tâche est stockée dans le catalogue système pg_statistic. Les entrées dans pg_statistic sont mises à jour par les commandes ANALYZE et VACUUM ANALYZE, et sont toujours approximatives même quand elles sont récemment mises à jour.
Plutôt que voir pg_statistic directement, il est mieux de regarder sa vue pg_stats quand on examine les statistiques manuellement. pg_stats est conçu pour être plus facilement lisible. De plus, pg_stats est lisible par tous, tandis que pg_statistic n'est lisible que par le superutilisateur. (Ceci évite la lecture, par des utilisateurs n'ayant pas les droits, du contenu de tables d'autres utilisateurs à partir des statistiques. La vue pg_stats ne montre que les lignes des tables que l'utilisateur courant peut lire). Par exemple, nous pouvons faire :
regression=# select attname, n_distinct, most_common_vals from pg_stats where tablename = 'road';
attname | n_distinct | most_common_vals
---------+------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
name | -0.467008 | {"I- 580 Ramp","I- 880 Ramp","Sp Railroad ","I- 580 ","I- 680 Ramp","I- 80 Ramp","14th St ","5th St ","Mission Blvd","I- 880 "}
thepath | 20 | {"[(-122.089,37.71),(-122.0886,37.711)]"}
(2 rows)
regression=# |
Table 1. Colonnes pg_stats
| Nom | Type | Description |
|---|---|---|
| tablename | name | Name of table containing column |
| attname | name | Column described by this row |
| null_frac | real | Fraction of column's entries that are NULL |
| avg_width | integer | Average width in bytes of column's entries |
| n_distinct | real | If greater than zero, the estimated number of distinct values in the column. If less than zero, the negative of the number of distinct values divided by the number of rows. (The negated form is used when ANALYZE believes that the number of distinct values is likely to increase as the table grows; the positive form is used when the column seems to have a fixed number of possible values.) For example, -1 indicates a unique column in which the number of distinct values is the same as the number of rows. |
| most_common_vals | text[] | A list of the most common values in the column. (Omitted if no values seem to be more common than any others.) |
| most_common_freqs | real[] | A list of the frequencies of the most common values, ie, number of occurrences of each divided by total number of rows. |
| histogram_bounds | text[] | A list of values that divide the column's values into groups of approximately equal population. The most_common_vals, if present, are omitted from the histogram calculation. (Omitted if column data type does not have a < operator, or if the most_common_vals list accounts for the entire population.) |
| correlation | real | Statistical correlation between physical row ordering and logical ordering of the column values. This ranges from -1 to +1. When the value is near -1 or +1, an index scan on the column will be estimated to be cheaper than when it is near zero, due to reduction of random access to the disk. (Omitted if column data type does not have a < operator.) |
Le nombre maximum d'entrées dans les tableaux most_common_vals et histogram_bounds peuvent être placées sur une base colonne-par-colonne en utilisant la commande ALTER TABLE SET STATISTICS. La limite par défaut est actuellement de 10 entrées. Augmenter la limite peut permettre des estimations plus précises effectuées par le planner, en particulier pour les colonnes avec des distributions de données irrégulières, au prix d'une consommation de plus d'espace dans pg_statistic et légèrement plus de temps pour calculer les estimations. Réciproquement, une limite plus basse peut être appropriée pour les colonnes avec des distributions de données simples.
| <<< Previous | Home | Next >>> |
| Astuces de performance | Up | Contrôle du planner avec des JOIN explicites |