Configurer et gérer des statistiques de table automatisées dans Fabric Spark

S’applique à :✅ Ingénierie des données fabric et science des données

Les statistiques de table automatisées dans Microsoft Fabric permettent à Spark d’optimiser l’exécution des requêtes en collectant automatiquement les métriques de table et de colonne pour les tables Delta.

  • Nombres de lignes.
  • Nombre de valeurs nulles par colonne.
  • Valeurs minimales et maximales par colonne.
  • Nombre de valeurs distinctes par colonne.
  • Longueurs moyennes et maximales des colonnes.

Par défaut, ces statistiques étendues sont collectées pour les 32 premières colonnes (y compris les colonnes imbriquées) des tables Delta dans Fabric. Ces données aident l’optimiseur basé sur les coûts (CBO) de Spark à améliorer la planification des jointures, des filtres, des agrégations et de l’élagage de partition.

Par conséquent, de nombreuses charges de travail peuvent réduire la latence des requêtes et l’utilisation du calcul avec moins de maintenance manuelle des statistiques.

Pour des conseils sur les stratégies d'optimisation des tables entre charges de travail, consultez Maintenance et optimisation des tables à travers les charges de travail.

Principaux avantages

Les statistiques automatisées offrent les avantages suivants :

  • Activé automatiquement pour les tables Delta dans Fabric.
  • Améliore la qualité de la planification des requêtes pour les modèles d’analyse courants.
  • Réduit la nécessité d’une collecte manuelle répétée de statistiques.
  • Stocke les statistiques en dehors des fichiers de données de table pour éviter le ballonnement des fichiers de données.

Fonctionnement

Fabric Spark collecte des statistiques étendues au moment de l’écriture et les utilise pendant la planification.

Étendue et comportement de la collection :

  • Les statistiques sont collectées au moment de l’écriture.
  • La collection cible les 32 premières colonnes (y compris les colonnes imbriquées).
  • Les propriétés de table peuvent remplacer le comportement au niveau de la session.
  • La configuration contrôle si Spark injecte des statistiques dans l’optimiseur.

Ces métriques aident Spark à choisir de meilleures stratégies de jointure, à améliorer la taille des partitions et à optimiser les plans d’agrégation.

Activer ou désactiver la collecte de statistiques

Utilisez la configuration de session (espace de travail ou étendue du bloc-notes) ou les propriétés de table (par étendue de table).

Configuration de session

Vous pouvez activer ou désactiver l’injection de statistiques étendues et d’optimiseur au niveau de la session.

Ces paramètres peuvent être appliqués via Spark SQL, PySpark ou Scala Spark.

Exécutez les instructions SQL Spark suivantes pour permettre la collecte et l’injection d’optimiseurs :

SET spark.microsoft.delta.stats.collect.extended=true;
SET spark.microsoft.delta.stats.injection.enabled=true;

Pour désactiver l’un ou l’autre paramètre, utilisez la même commande avec la valeur définie à false.

Remarque

La collecte des statistiques du journal delta (spark.databricks.delta.stats.collect) doit également être activée (valeur par défaut : true).

Important

Si vous activez les vecteurs de suppression sur une table, désactivez l’injection de statistiques pour cette table. Sur les tables qui utilisent des vecteurs de suppression avec des mises à jour ou des suppressions fréquentes, les statistiques étendues peuvent devenir inexactes et faire en sorte que Spark sous-estime la taille de la table. Lorsque cela se produit, l’optimiseur peut choisir une jointure de diffusion qui n’est pas appropriée, ce qui peut entraîner l’échec des requêtes. Pour éviter ce comportement, désactivez l’injection de statistiques afin que l’optimiseur n’utilise pas les statistiques injectées :

  • Portée de la session : définir spark.microsoft.delta.stats.injection.enabled sur false.
  • Étendue de la table : définissez la delta.stats.extended.inject propriété de table sur false.

Vous pouvez activer la collecte des statistiques. Pour les tables qui utilisent des vecteurs de suppression, désactivez uniquement l’injection dans l’optimiseur.

Une stratégie d’entretien régulier de table réduit ce risque. OPTIMIZE Purge automatiquement les fichiers où plus de 5% de lignes sont référencées par des vecteurs de suppression, et REORG TABLE ... APPLY (PURGE) peut forcer une réécriture en dessous de ce seuil. Comme les statistiques étendues sont collectées au moment de l’écriture, la réécriture actualise les statistiques des fichiers affectés. Pour les tables faisant l’objet de mises à jour ou de suppressions fréquentes, laissez l’injection désactivée entre les cycles de maintenance.

Propriétés de la table (remplacer la configuration de session)

Les propriétés de table vous permettent de contrôler la collecte des statistiques sur des tables individuelles, en remplaçant les paramètres de session.

Activez sur une table :

ALTER TABLE tableName
SET TBLPROPERTIES(
    'delta.stats.extended.collect' = 'true',
    'delta.stats.extended.inject' = 'true'
)

Pour désactiver l’une ou l’autre propriété de table, fixez sa valeur à false.

Comportement par défaut de création de table

Utilisez ce paramètre au niveau de la session pour désactiver l’horodatage automatique des propriétés de table de statistiques étendues lorsque de nouvelles tables sont créées.

Utilisez cette instruction Spark SQL pour désactiver le paramètre automatique lors de la création de la table :

SET spark.microsoft.delta.stats.collect.extended.property.setAtTableCreation=false;

Vérifier les statistiques

Vous pouvez examiner les statistiques disponibles pour un plan de requête optimisé en utilisant les API Spark. Ces API renvoient des statistiques génériques de forfaits provenant de toute source disponible, y compris les statistiques du catalogue Spark. Un résultat ne confirme pas que des statistiques étendues Fabric ont été collectées pour le tableau.

Vérifiez le nombre de lignes et la taille de table (exemple Scala) :

println(spark.read.table("tableName").queryExecution.optimizedPlan.stats)

Vérifiez les statistiques détaillées des colonnes :

val stats = spark.read.table("tableName").queryExecution.optimizedPlan.stats

stats.attributeStats.foreach { case (attrName, colStat) =>
    println(s"colName: $attrName distinctCount: ${colStat.distinctCount} min: ${colStat.min} max: ${colStat.max} nullCount: ${colStat.nullCount} avgLen: ${colStat.avgLen} maxLen: ${colStat.maxLen}")
}

Recompiler les statistiques

Les statistiques peuvent devenir obsolètes après les modifications de schéma ou les mises à jour partielles. Utilisez l’une des approches suivantes pour recompiler.

Réécrire la table (remarque : cela réinitialise l’historique) :

spark.read.table("targetTable").write.partitionBy("partCol").mode("overwrite").saveAsTable("targetTable")

Approche recommandée (Fabric Spark >= 3.2.0.19) :

from pyspark.sql.delta import StatisticsStore

StatisticsStore.recomputeStatisticsWithCompaction(spark, "testTable1")

Si le schéma change (par exemple, vous ajoutez ou supprimez des colonnes), supprimez les anciennes statistiques avant de recalculer :

from pyspark.sql.delta import StatisticsStore

StatisticsStore.removeStatisticsData(spark, "testTable1")
StatisticsStore.recomputeStatisticsWithCompaction(spark, "testTable1")

Utiliser ANALYZE TABLE

Utilisez ANALYZE TABLE pour calculer les statistiques du catalogue Spark sur toutes les colonnes. Cette commande ne recalcule pas les statistiques étendues stockées par les statistiques automatisées de table. Pour recalculer ces statistiques, utilisez StatisticsStore.recomputeStatisticsWithCompaction.

Exécutez la commande :

Exécutez l’instruction Spark SQL suivante :

ANALYZE TABLE tableName COMPUTE STATISTICS FOR ALL COLUMNS

Activer l’injection de statistiques de catalogue :

Utilisez cette instruction SQL de Spark pour permettre l’injection de statistiques dans le catalogue :

SET spark.microsoft.delta.stats.injection.catalog.enabled=true;

Pour désactiver l’injection de statistiques de catalogue, utilisez le même paramètre avec la valeur définie à false.

Limites

Il est important de comprendre les limitations actuelles des statistiques automatisées de Fabric afin de pouvoir planifier en conséquence.

  • Les statistiques sont collectées uniquement au moment de l’écriture.
  • Les mises à jour d’autres moteurs ne sont pas agrégées automatiquement.
  • Seules les 32 premières colonnes sont incluses (y compris les colonnes imbriquées).
  • Les suppressions et mises à jour peuvent rendre les statistiques obsolètes. Pour les tables utilisant des vecteurs de suppression, la maintenance régulière OPTIMIZE ou REORG TABLE ... APPLY (PURGE) réécrit les fichiers concernés et actualise leurs statistiques. Désactivez l’injection de statistiques entre les cycles de maintenance sur les tables avec des mises à jour ou suppressions fréquentes.
  • Le recalcul nécessite une opération API de réécriture ou de calcul de statistiques.
  • L’injection de statistiques ne s’applique pas aux colonnes imbriquées.
  • Dans certaines charges de travail, les statistiques obsolètes ou incomplètes peuvent entraîner des régressions.
  • ANALYZE TABLE la prise en charge est limitée à FOR ALL COLUMNS.
  • L’ordre des colonnes ou les modifications de configuration peuvent nécessiter une actualisation complète.