Configurare e gestire statistiche di tabella automatizzate in Fabric Spark

Si applica a:✅ Ingegneria dei dati e data science di Fabric

Le statistiche di tabella automatizzate in Microsoft Fabric consentono a Spark di ottimizzare l'esecuzione delle query raccogliendo automaticamente le metriche delle tabelle e delle colonne per le tabelle Delta.

  • Conteggi delle righe.
  • Conteggi null per colonna.
  • Valori minimi e massimi per colonna.
  • Conteggi dei valori distinti per colonna.
  • Lunghezze medie e massime delle colonne.

Per impostazione predefinita, queste statistiche estese vengono raccolte per le prime 32 colonne (incluse le colonne nidificate) delle tabelle Delta in Fabric. Questi dati aiutano l'ottimizzatore basato sui costi (CBO) di Spark a migliorare la pianificazione per join, filtri, aggregazioni e potatura delle partizioni.

Di conseguenza, molti carichi di lavoro possono ridurre la latenza delle query e l'utilizzo di calcolo con una manutenzione delle statistiche meno manuale.

Per indicazioni inter-carichi di lavoro sulle strategie di ottimizzazione delle tabelle, vedere Manutenzione e ottimizzazione delle tabelle inter-carichi di lavoro.

Vantaggi principali

Le statistiche automatizzate offrono i vantaggi seguenti:

  • Abilitata automaticamente per le tabelle Delta in Fabric.
  • Migliora la qualità della pianificazione delle query per i modelli di analisi comuni.
  • Riduce la necessità di una raccolta di statistiche manuali ripetute.
  • Archivia le statistiche al di fuori dei file di dati delle tabelle per evitare il bloat del file di dati.

Come funziona

Fabric Spark raccoglie statistiche estese in fase di scrittura e le usa durante la pianificazione.

Ambito e comportamento della raccolta:

  • Le statistiche vengono raccolte in fase di scrittura.
  • La raccolta mira alle prime 32 colonne (incluse le colonne nidificate).
  • Le proprietà della tabella possono eseguire l'override del comportamento a livello di sessione.
  • La configurazione controlla se Spark inserisce le statistiche nell'utilità di ottimizzazione.

Queste metriche consentono a Spark di scegliere strategie di join migliori, migliorare l'eliminazione delle partizioni e ottimizzare i piani di aggregazione.

Abilitare o disabilitare la raccolta di statistiche

Usare la configurazione della sessione (ambito dell'area di lavoro o del notebook) o le proprietà della tabella (ambito per tabella).

Configurazione della sessione

È possibile abilitare o disabilitare la raccolta di statistiche estese e l'inserimento dell'utilità di ottimizzazione a livello di sessione.

Queste impostazioni possono essere applicate tramite Spark SQL, PySpark o Scala Spark.

Esegui le seguenti istruzioni SQL di Spark per abilitare la raccolta e l'iniezione di ottimizzatori:

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

Per disabilitare entrambe le impostazioni, usa lo stesso comando con il valore impostato su false.

Annotazioni

La raccolta delle statistiche dei log delta (spark.databricks.delta.stats.collect) deve essere abilitata anche (impostazione predefinita: true).

Important

Se si abilitano i vettori di eliminazione in una tabella, disabilitare l'inserimento delle statistiche per tale tabella. Nelle tabelle che usano vettori di eliminazione con aggiornamenti o eliminazioni frequenti, le statistiche estese possono diventare imprecise e causare la sottovalutazione delle dimensioni della tabella. Quando ciò accade, l'ottimizzatore potrebbe scegliere un broadcast join non adatto, causando l'errore delle query. Per evitare questo comportamento, disabilitare l'inserimento delle statistiche in modo che Optimizer non usi le statistiche inserite:

  • Ambito della sessione: impostare spark.microsoft.delta.stats.injection.enabled su false.
  • Ambito della tabella: impostare la proprietà della tabella delta.stats.extended.inject su false.

È possibile mantenere abilitata la raccolta di statistiche. Per le tabelle che utilizzano vettori di eliminazione, disabilitare solo l'iniezione nell'ottimizzatore.

Una strategia regolare di manutenzione dei tavoli riduce questo rischio. OPTIMIZE Elimina automaticamente i file in cui più di 5% di righe sono riferite da vettori di cancellazione e REORG TABLE ... APPLY (PURGE) può forzare una riscrittura al di sotto di quella soglia. Poiché le statistiche estese vengono raccolte al momento della scrittura, la riscrittura aggiorna le statistiche dei file interessati. Per le tabelle con aggiornamenti o cancellazioni frequenti, tieni l'iniezione disabilitata tra i cicli di manutenzione.

Proprietà della tabella (override della configurazione della sessione)

Le proprietà della tabella consentono di controllare la raccolta delle statistiche su singole tabelle, sostituendo le impostazioni della sessione.

Abilitare in una tabella:

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

Per disabilitare una delle due proprietà della tabella, imposta il suo valore a false.

Comportamento predefinito per la creazione di tabelle

Utilizzare questa impostazione a livello di sessione per disabilitare il timbro automatico delle proprietà della tabella delle statistiche estese quando vengono create nuove tabelle.

Usare questa istruzione SPARK SQL per disabilitare l'impostazione automatica al momento della creazione della tabella:

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

Controllare le statistiche

Puoi ispezionare le statistiche disponibili per un piano di query ottimizzato utilizzando le API di Spark. Queste API restituiscono statistiche generiche sui piani da qualsiasi fonte disponibile, incluse le statistiche del catalogo Spark. Il risultato non conferma che siano state raccolte le statistiche estese di Fabric per la tabella.

Controllare il numero di righe e le dimensioni della tabella (esempio Scala):

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

Controllare le statistiche dettagliate delle colonne:

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}")
}

Ricompilare le statistiche

Le statistiche possono diventare obsolete dopo le modifiche dello schema o gli aggiornamenti parziali. Usare uno degli approcci seguenti per ricompilare.

Riscrivere la tabella (nota: questo azzera la cronologia).

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

Approccio consigliato (Fabric Spark >= 3.2.0.19):

from pyspark.sql.delta import StatisticsStore

StatisticsStore.recomputeStatisticsWithCompaction(spark, "testTable1")

Se lo schema cambia (ad esempio, aggiungi o rimuovi colonne), rimuovi vecchie statistiche prima di ricalcolare:

from pyspark.sql.delta import StatisticsStore

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

Utilizzare ANALYZE TABLE

Usare ANALYZE TABLE per calcolare le statistiche del catalogo Spark per tutte le colonne. Questo comando non ricalcola le statistiche estese memorizzate da Automated Table Statistics. Per ricalcolare queste statistiche, usa StatisticsStore.recomputeStatisticsWithCompaction.

Eseguire il comando:

Eseguire l'istruzione SPARK SQL seguente:

ANALYZE TABLE tableName COMPUTE STATISTICS FOR ALL COLUMNS

Abilitare l'inserimento delle statistiche del catalogo:

Usa questa istruzione SQL di Spark per abilitare l'iniezione di statistiche del catalogo:

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

Per disabilitare l'iniezione di statistiche del catalogo, usa la stessa impostazione con il valore impostato su false.

Limitazioni

È importante comprendere le limitazioni correnti delle statistiche automatizzate di Fabric in modo da poter pianificare di conseguenza.

  • Le statistiche vengono raccolte solo in fase di scrittura.
  • Gli aggiornamenti di altri motori non vengono aggregati automaticamente.
  • Sono incluse solo le prime 32 colonne (incluse le colonne nidificate).
  • Le eliminazioni e gli aggiornamenti possono rendere le statistiche non aggiornate. Per le tabelle che utilizzano vettori di eliminazione, la manutenzione regolare OPTIMIZE o REORG TABLE ... APPLY (PURGE) riscrive i file interessati e ne aggiorna le statistiche. Disabilita l'iniezione di statistiche tra i cicli di manutenzione su tabelle con aggiornamenti o cancellazioni frequenti.
  • La ricomputazione richiede un'operazione di riscrittura o di statistiche dell'API.
  • L'inserimento delle statistiche non si applica alle colonne nidificate.
  • In alcuni carichi di lavoro, le statistiche non aggiornate o incomplete possono causare regressioni.
  • ANALYZE TABLE il supporto è limitato a FOR ALL COLUMNS.
  • L'ordinamento delle colonne o le modifiche alla configurazione possono richiedere l'aggiornamento completo.