ANALYZE |
Analyse |
PostgreSQL |
Syntaxe
ANALYZE [ VERBOSE ] [ table_name [ ( column_name [, ...] ) ] ]
|
Paramètres
Nom |
Description |
VERBOSE |
Ce paramètre permet l'affichage des messages de progression. Lorsque VERBOSE est spécifié, ANALYZE émet des messages de progression pour indiquer quelle table est en cours de traitement. Diverses statistiques sur les tables sont également affichées. |
table_name |
Ce paramètre permet d'indiquer le nom (éventuellement qualifié de schéma) d'une table spécifique à analyser. En cas d'omission, toutes les tables normales, les tables partitionnées et les vues matérialisées de la base de données actuelle sont analysées (mais pas les tables étrangères). Si la table spécifiée est une table partitionnée, les statistiques d'héritage de la table partitionnée dans son ensemble et les statistiques des partitions individuelles sont mises à jour. |
column_name |
Ce paramètre permet d'indiquer le nom d'une colonne spécifique à analyser. Par défaut, toutes les colonnes. |
Description
Cette instruction permet de collecter des statistiques sur une base de données.
Remarques
- L'instruction ANALYZE collecte des statistiques sur le contenu des tables de la base de données et entrepose les résultats dans le catalogue système pg_statistic. Par la suite, le
planificateur de requêtes utilise ces statistiques pour aider à déterminer les plans d'exécution les plus efficaces pour les requêtes.
- Sans paramètre, ANALYZE examine chaque table de la base de données actuelle. Avec un paramètre, ANALYZE examine uniquement cette table. Il est en outre possible de fournir une liste
de noms de colonnes, auquel cas seules les statistiques de ces colonnes sont collectées.
- Pour analyser une table, il faut généralement être le propriétaire de la table ou un superutilisateur. Cependant, les propriétaires de bases de données sont autorisés à analyser toutes les tables
de leurs bases de données, à l'exception des catalogues partagés. (La restriction pour les catalogues partagés signifie qu'une véritable ANALYSE à l'échelle de la base de données ne peut être
effectuée que par un superutilisateur.) ANALYZE ignorera toutes les tables que l'utilisateur appelant n'a pas la permission d'analyser.
- Les tables étrangères ne sont analysées que lorsqu'elles sont explicitement sélectionnées. Tous les enveloppes de données étrangères ne prennent pas en charge ANALYZE. Si l'encapsuleur de
la table ne prend pas en charge ANALYZE, la commande affiche un avertissement et ne fait rien.
- Dans la configuration par défaut de PostgreSQL, le service autovacuum s'occupe de l'analyse automatique des tables lorsqu'elles sont chargées pour la première fois avec des données,
et au fur et à mesure qu'elles changent au cours du fonctionnement normal. Lorsque l'autovacuum est désactivé, c'est une bonne idée d'exécuter ANALYZE périodiquement, ou juste après avoir
apporté des modifications majeures au contenu d'une table. Des statistiques précises aideront le planificateur à choisir le plan de requête le plus approprié et amélioreront ainsi la vitesse de traitement
des requêtes. Une stratégie courante pour les bases de données principalement en lecture consiste à exécuter VACUUM et ANALYZE une fois par jour pendant une période de faible utilisation de
la journée. (Ce ne sera pas suffisant s'il y a une forte activité de mise à jour.)
- L'instruction ANALYZE ne nécessite qu'un verrou en lecture sur la table cible, il peut donc s'exécuter en parallèle avec d'autres activités sur la table.
- Les statistiques collectées par ANALYZE incluent généralement une liste de certaines des valeurs les plus courantes dans chaque colonne et un histogramme montrant la distribution
approximative des données dans chaque colonne. L'un ou les deux peuvent être omis si ANALYZE les juge inintéressants (par exemple, dans une colonne à clé unique, il n'y a pas de valeurs communes)
ou si le type de données de la colonne ne prend pas en charge les opérateurs appropriés.
- Pour les grands tableaux, ANALYZE prend un échantillon aléatoire du contenu du tableau, plutôt que d'examiner chaque ligne. Cela permet même d'analyser de très grandes tables en peu de temps.
Notez, cependant, que les statistiques ne sont qu'approximatives et qu'elles changeront légèrement à chaque exécution d'ANALYSE, même si le contenu réel de la table n'a pas changé. Cela peut
entraîner de petits changements dans les coûts estimés du planificateur indiqués par EXPLAIN. Dans de rares situations, ce non-déterminisme entraînera la modification des choix du planificateur de
plans de requête après l'exécution d'ANALYZE.
- L'étendue de l'analyse peut être contrôlée en ajustant la variable de configuration default_statistics_target, ou colonne par colonne en définissant la cible des statistiques par colonne avec
ALTER TABLE ... ALTER COLUMN ... SET STATISTICS (voir ALTER TABLE). La valeur cible définit le nombre maximal d'entrées dans la liste des valeurs les
plus courantes et le nombre maximal de groupes dans l'histogramme. La valeur cible par défaut est 100, mais elle peut être ajustée vers le haut ou vers le bas pour compenser la précision des estimations
du planificateur par rapport au temps pris pour ANALYSER et à la quantité d'espace occupée dans pg_statistic. En particulier, la définition de la cible des statistiques sur zéro désactive
la collecte des statistiques pour cette colonne. Il peut être utile de le faire pour les colonnes n'étant jamais utilisées dans le cadre des clauses WHERE, GROUP BY ou ORDER BY des
requêtes, car le planificateur n'aura aucune utilité pour les statistiques sur ces colonnes.
- La plus grande cible de statistiques parmi les colonnes analysées détermine le nombre de lignes de tableau échantillonnées pour préparer les statistiques. L'augmentation de la cible entraîne une
augmentation proportionnelle du temps et de l'espace nécessaires pour faire ANALYSER.
- L'une des valeurs estimées par ANALYZE est le nombre de valeurs distinctes apparaissant dans chaque colonne. Étant donné que seul un sous-ensemble des lignes est examiné, cette estimation
peut parfois être assez inexacte, même avec la cible statistique la plus large possible. Si cette imprécision conduit à de mauvais plans de requête, une valeur plus précise peut être déterminée manuellement
puis installée avec ALTER TABLE ... ALTER COLUMN ... SET (n_distinct = ...) (voir ALTER TABLE).
- Si la table en cours d'analyse a un ou plusieurs enfants, ANALYZE rassemblera les statistiques deux fois : une fois sur les lignes de la table parent uniquement, et une seconde fois sur les
lignes de la table parent avec tous ses enfants. Ce deuxième ensemble de statistiques est nécessaire lors de la planification des requêtes traversant l'intégralité de l'arbre d'héritage. Le service
autovacuum, cependant, ne considérera que les insertions ou les mises à jour sur la table parent elle-même lorsqu'il décidera de déclencher une analyse automatique pour cette table. Si cette
table est rarement insérée ou mise à jour, les statistiques d'héritage ne seront pas à jour sauf si vous exécutez ANALYZE manuellement.
- Si l'une des tables enfant est une table étrangère dont les enveloppes de données distantes ne prennent pas en charge ANALYZE, ces tables enfant sont ignorées lors de la collecte des
statistiques d'héritage.
- Si la table en cours d'analyse est complètement vide, ANALYZE n'enregistrera pas de nouvelles statistiques pour cette table. Toutes les statistiques existantes seront conservées.
Dernière mise à jour : Jeudi, le 14 Octobre 2021