CREATE STATISTICS — définit des statistiques étendues
CREATE STATISTICS [ IF NOT EXISTS ]nom_statistiques
[ (type_statistique
[, ... ] ) ] ONnom_colonne
,nom_colonne
[, ...] FROMnom_table
CREATE STATISTICS
créera un nouvel objet de suivi des
statistiques étendues sur les données de la table, table distante ou vue
matérialisée spécifiée. L'objet statistiques sera créé dans la base de
données courante et son propriétaire sera l'utilisateur exécutant la
commande.
Si un nom de schéma est donné (par exemple, CREATE STATISTICS
monschema.mastat ...
) alors l'objet statistiques est crée dans le
schéma spécifié. Autrement, il sera crée dans le schéma courant. Le nom de
l'objet statistiques doit être différent du nom de tous les autres objets
statistiques dans le même schéma.
IF NOT EXISTS
Ne renvoie pas d'erreur si un objet statistiques de même nom existe déjà. Une note est affichée dans ce cas. Veuiller noter que seul le nom de l'objet statistiques est pris en compte ici, et non pas le détail de sa définition.
nom_statistiques
Le nom (éventuellement qualifié du nom du schéma) de l'objet statistiques devant être crée.
type_statistique
Un type de statistique devant être calculé dans cet objet statistiques.
Les types actuellement supportés sont
ndistinct
, qui active des statistiques n-distinct,
dependencies
qui active des statistiques de dépendances
fonctionnelles, et mcv
qui active les listes
des valeurs les plus fréquentes.
Si cette clause est omise, tous les types statistiques supportés sont
inclus dans l'objet statistique.
Pour plus d'informations, voir Section 14.2.2
et Section 71.2.
nom_colonne
Le nom d'une colonne de la table devant être couverte par les statistiques calculées. Au moins deux noms de colonnes doivent être fournis ; l'ordre des colonnes n'a pas d'importance.
nom_table
Le nom (éventuellement qualifié du nom du schéma) de la table contenant le(s) colonne(s) sur lesquelles les statistiques sont calculées ; voir ANALYZE pour une explication de la gestion de l'héritage et des partitions.
Vous devez être le propriétaire de la table pour créer un objet statistiques lisant ses données. Une fois celui-ci créé le propriétaire de l'objet statistiques est indépendant de la ou les tables sous-jacentes.
Les statistiques étendues ne sont actuellement pas utilisées par l'optimiseur pour les estimations de sélectivité réalisées pour les jointures de table. Cette limitation sera probablement supprimée dans une version future de PostgreSQL.
Créer une table t1
avec deux colonnes
fonctionnellement dépendantes, c'est-à-dire que la connaissance de la valeur
de la première colonne est suffisante pour déterminer la valeur de l'autre
colonne. Ensuite des statistiques de dépendances fonctionnelles sont
construites sur ces colonnes :
CREATE TABLE t1 ( a int, b int ); INSERT INTO t1 SELECT i/100, i/500 FROM generate_series(1,1000000) s(i); ANALYZE t1; -- le nombre de lignes correspondantes sera drastiquement sous-estimé : EXPLAIN ANALYZE SELECT * FROM t1 WHERE (a = 1) AND (b = 0); CREATE STATISTICS s1 (dependencies) ON a, b FROM t1; ANALYZE t1; -- à présent le nombre de ligne estimé est plus précis : EXPLAIN ANALYZE SELECT * FROM t1 WHERE (a = 1) AND (b = 0);
Sans statistiques fonctionnellement dépendantes, l'optimisateur supposera
que les deux conditions WHERE
sont indépendantes, et
multiplierait leurs sélectivités pour arriver à une estimation du nombre de
lignes bien trop basse.
Avec de telles statistiques, l'optimiseur reconnaît que les conditions
WHERE
sont redondantes et ne sous-estime plus le nombre
de lignes.
Créer une table t2
avec deux colonnes parfaitement
corrélées (contenant des données identiques), et une liste MCV sur ces
colonnes :
CREATE TABLE t2 ( a int, b int ); INSERT INTO t2 SELECT mod(i,100), mod(i,100) FROM generate_series(1,1000000) s(i); CREATE STATISTICS s2 (mcv) ON a, b FROM t2; ANALYZE t2; -- valid combination (found in MCV) EXPLAIN ANALYZE SELECT * FROM t2 WHERE (a = 1) AND (b = 1); -- invalid combination (not found in MCV) EXPLAIN ANALYZE SELECT * FROM t2 WHERE (a = 1) AND (b = 2);
La liste MCV donne au planificateur des informations plus détaillées à propos des valeurs spécifiques qui apparaissent le plus fréquemment dans la table, de même qu'une borne supérieure sur les sélectivités des combinaisons de valeurs qui n'apparaissent pas dans la table, lui permettant de générer de meilleures estimations dans les deux cas.
Il n'y a pas de commande CREATE STATISTICS
dans le
standard SQL.