Statistiques du planificateur Postgres
Bêta
À compter du 15 juin, Lakebase est disponible en Bêta sur GCP. Consultez Disponibilité par région pour les régions prises en charge.
Le planificateur de query Postgres utilise les statistiques du planificateur pour estimer le nombre de lignes retournées par chaque étape d'une query et pour choisir un plan d'exécution. Cette page décrit quand Postgres génère automatiquement des statistiques de planificateur, comment trouver les tables auxquelles il manque des statistiques et comment modifier le moment où elles sont générées pour une table. Pour savoir comment Lakebase préserve les statistiques lors des redémarrages du compute et lors de Monter en charge à zéro, consultez Collecte de statistiques.
Quand ANALYZE s'exécute-t-il sur une table ?
Autovacuum génère automatiquement les statistiques du planificateur en exécutant ANALYZE sur une table une fois qu’un nombre suffisant de lignes ont été modifiées. Une table est analysée lorsque le nombre de lignes insérées, mises à jour ou supprimées depuis la dernière analyse dépasse :
autovacuum_analyze_threshold + autovacuum_analyze_scale_factor × number of rows in the table
Avec les paramètres par default (autovacuum_analyze_threshold = 50 et autovacuum_analyze_scale_factor = 0.1), une nouvelle table est analysée après l’insertion, la mise à jour ou la suppression de plus de 50 lignes, et une table existante l’est après que plus de 50 lignes plus 10 % de ses lignes ont changé. Par conséquent, une table chargée une fois avec 50 lignes ou moins et jamais modifiée n’est jamais analysée par autovacuum. Sans statistiques de planificateur, le planificateur se base sur les estimations default, ce qui peut entraîner des plans de query inefficaces lorsque cette table est jointe à de plus grandes tables.
Databricks recommande d’exécuter ANALYZE sur de nouvelles tables après le chargement initial des données, et sur des tables de 50 lignes ou moins (le threshold autoanalyze default), afin que des statistiques de planification précises soient en place avant que les tables ne soient query.
Analyser les tables partitionnées
L’autovacuum analyse chaque partition d’une table partitionnée à mesure que les lignes de cette partition changent, mais il n’analyse jamais la table partitionnée elle-même (le parent). Les statistiques du parent décrivent la table dans son ensemble et ne sont générées que lorsque vous exécutez ANALYZE sur le parent. Sans ces dernières, les queries qui font référence à la table partitionnée peuvent obtenir des plans inefficaces. Exécutez ANALYZE sur le parent après avoir chargé des données pour la première fois et à chaque fois que la distribution des données sur ses partitions change de manière significative :
ANALYZE my_schema.my_partitioned_table;
Lorsque vous exécutez ANALYZE sur le parent, Postgres échantillonne les lignes de toutes les partitions pour construire les statistiques du parent. Par default, il analyse également chaque partition et met à jour ses statistiques, ce qui peut prendre beaucoup de temps sur une grande table.
Dans Postgres 18 et au-delà, utilisez ANALYZE ONLY pour mettre à jour les statistiques du parent sans analyser chaque partition. Postgres échantillonne toujours les lignes de toutes les partitions, et autovacuum continue d’analyser les partitions à mesure que leurs lignes changent.
ANALYZE ONLY my_schema.my_partitioned_table;
Dans Postgres 16 et 17, ANALYZE sur une table partitionnée analyse toujours chaque partition. Dans n’importe quelle version, pour mettre à jour les statistiques pour une partition, exécutez ANALYZE sur cette partition.
Rechercher les tables sans statistiques de planificateur
Pour trouver des tables qui ne possèdent pas de statistiques de planification, cherchez les tables sans lignes dans la vue pg_stats. Les statistiques du planificateur sont stockées durablement, cette vérification est donc fiable même après le Reset des statistiques cumulées. La query exclut les schémas système et les schémas que Lakebase utilise en interne pour l’API de données et les tables synchronisées.
SELECT t.schemaname, t.tablename
FROM pg_tables t
WHERE t.schemaname NOT IN ('pg_catalog', 'information_schema', '__db_system', 'pgrst')
AND t.schemaname NOT LIKE '\_\_db\_user\_%'
AND NOT EXISTS (
SELECT 1 FROM pg_stats s
WHERE s.schemaname = t.schemaname AND s.tablename = t.tablename
)
ORDER BY 1, 2;
Exécutez la query en tant que membre du rôle databricks_superuser ou en tant que propriétaire de la table. La vue pg_stats affiche des statistiques uniquement pour les colonnes que le rôle actuel peut lire. Pour une table avec la sécurité au niveau des lignes activée, elle masque également les statistiques sauf si le rôle peut contourner la sécurité au niveau des lignes. Une table que le rôle actuel ne peut pas lire, ou qui a la sécurité au niveau des lignes activée, peut apparaître dans les résultats même si elle possède des statistiques.
Les tables qui n’ont jamais contenu de données apparaissent également dans les résultats, car ANALYZE ne génère pas de statistiques pour une table vide. Concentrez-vous sur les tables qui contiennent des données et sont utilisées dans les query.
Pour générer des statistiques de planificateur pour une table retournée par la query, exécutez ANALYZE:
ANALYZE my_schema.my_table;
Pour analyser chaque table dans la base de données actuelle, exécutez ANALYZE sans nom de table.
Personnaliser les paramètres de l’autovacuum pour une table
Si une table change trop rarement pour les threshold par défaut, vous pouvez abaisser le threshold d'analyse pour cette table uniquement. Par exemple, pour analyser une petite table de référence après plus de 10 modifications de lignes indépendamment de sa taille :
ALTER TABLE my_schema.my_table SET (
autovacuum_analyze_threshold = 10,
autovacuum_analyze_scale_factor = 0
);
Pour afficher les paramètres personnalisés d'une table, utilisez la query pg_class.reloptions:
SELECT relname, reloptions
FROM pg_class
WHERE oid = 'my_schema.my_table'::regclass;
Pour rétablir le comportement par default, réinitialisez les paramètres :
ALTER TABLE my_schema.my_table RESET (
autovacuum_analyze_threshold,
autovacuum_analyze_scale_factor
);
Même avec un threshold plus bas, l'autovacuum ne réalise pas l'analyse d'une table si le nombre de lignes chargées ne dépasse pas le threshold et si la table n'est jamais modifiée par la suite. Pour les tables statiques, exécutez ANALYZE après avoir chargé des données.
Pour plus d'informations, consultez la documentation Postgres :