Configurar e gerenciar estatísticas de tabela automatizadas no Fabric Spark

Aplica-se a:✅ Engenharia de dados e ciência de dados do Fabric

As Estatísticas automatizadas de Tabela no Microsoft Fabric ajudam o Spark a otimizar a execução da consulta coletando automaticamente métricas de tabela e coluna para tabelas Delta.

  • Contagens de linhas.
  • Contagens nulas por coluna.
  • Valores mínimos e máximos por coluna.
  • Contagens de valores distintos por coluna.
  • Comprimentos médios e máximos de coluna.

Por padrão, essas estatísticas estendidas são coletadas para as primeiras 32 colunas (incluindo colunas aninhadas) de tabelas Delta no Fabric. Esses dados ajudam o CBO (otimizador baseado em custo) do Spark a melhorar o planejamento de junções, filtros, agregações e podas de partição.

Como resultado, muitas cargas de trabalho podem reduzir a latência de consulta e o uso de computação com menos manutenção de estatísticas manuais.

Para obter diretrizes para otimização de tabelas entre diferentes cargas de trabalho, consulte Manutenção e otimização de tabelas entre diferentes cargas de trabalho.

Principais benefícios

As estatísticas automatizadas fornecem os seguintes benefícios:

  • Habilitado automaticamente para tabelas Delta no Fabric.
  • Melhora a qualidade do planejamento de consultas para padrões de análise comuns.
  • Reduz a necessidade de coleta de estatísticas manuais repetidas.
  • Armazena estatísticas fora dos arquivos de dados da tabela para evitar o inchaço dos arquivos de dados.

Como funciona

Fabric Spark coleta estatísticas estendidas no momento da gravação e as usa durante o planejamento.

Escopo e dinâmica de uma coleção

  • As estatísticas são coletadas no momento da gravação.
  • A coleção focaliza as primeiras 32 colunas (incluindo colunas aninhadas).
  • As propriedades da tabela podem substituir o comportamento no nível da sessão.
  • A configuração controla se o Spark injeta estatísticas no otimizador.

Essas métricas ajudam o Spark a escolher melhores estratégias de junção, melhorar a poda de partição e otimizar os planos de agregação.

Habilitar ou desabilitar a coleta de estatísticas

Use a configuração da sessão (escopo do workspace ou do notebook) ou as propriedades da tabela (escopo por tabela).

Configuração de sessão

Você pode habilitar ou desabilitar a coleta de estatísticas estendidas e a injeção do otimizador no nível da sessão.

Essas configurações podem ser aplicadas por meio do Spark SQL, PySpark ou Scala Spark.

Execute as seguintes instruções SQL do Spark para permitir a coleta e a injeção de otimizadores:

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

Para desativar qualquer uma das configurações, use o mesmo comando com o valor definido como false.

Observação

A coleção de estatísticas de log delta (spark.databricks.delta.stats.collect) também deve ser habilitada (padrão: true).

Important

Se você habilitar vetores de exclusão em uma tabela, desabilite a injeção de estatísticas para essa tabela. Em tabelas que usam vetores de exclusão com atualizações ou exclusões frequentes, as estatísticas estendidas podem se tornar imprecisas e fazer com que o Spark subestime o tamanho da tabela. Quando isso acontece, o otimizador pode escolher uma junção de transmissão que não é apropriada, o que pode causar falha nas consultas. Para evitar esse comportamento, desabilite a injeção de estatísticas para que o otimizador não use as estatísticas injetadas:

  • Escopo da sessão: definido spark.microsoft.delta.stats.injection.enabled como false.
  • Escopo da tabela: defina a propriedade da delta.stats.extended.inject tabela como false.

Você pode manter a coleta de estatísticas habilitada. Para tabelas que usam vetores de exclusão, desabilite apenas a injeção no otimizador.

Uma estratégia regular de manutenção de mesas reduz esse risco. OPTIMIZE elimina automaticamente arquivos onde mais de 5% de linhas são referenciadas por vetores de exclusão, e REORG TABLE ... APPLY (PURGE) pode forçar uma reescrita abaixo desse limite. Como as estatísticas estendidas são coletadas no momento da gravação, a reescrita atualiza as estatísticas dos arquivos afetados. Para tabelas com atualizações ou exclusões frequentes, mantenha a injeção desativada entre os ciclos de manutenção.

Propriedades da tabela (sobrescrever configuração de sessão)

As propriedades da tabela permitem controlar a coleta de estatísticas em tabelas individuais, substituindo as configurações de sessão.

Habilitar em uma tabela:

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

Para desabilitar qualquer uma das propriedades da tabela, defina seu valor para false.

Comportamento padrão de criação de tabela

Use essa configuração de nível de sessão para desabilitar o carimbo automático de propriedades da tabela de estatísticas estendidas quando novas tabelas forem criadas.

Use esta instrução SQL do Spark para desabilitar a configuração automática na criação da tabela:

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

Verificar estatísticas

Você pode inspecionar as estatísticas disponíveis em um plano de consulta otimizado usando APIs do Spark. Essas APIs retornam estatísticas genéricas de planos de qualquer fonte disponível, incluindo estatísticas do catálogo Spark. Um resultado não confirma que as estatísticas estendidas do Fabric foram coletadas para a tabela.

Verificar a contagem de linhas e o tamanho da tabela (exemplo de Scala):

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

Verifique as estatísticas detalhadas da coluna:

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

Recalcular estatísticas

As estatísticas podem ficar desatualizadas após alterações de esquema ou atualizações parciais. Use uma das abordagens a seguir para recalcular.

Reescreva a tabela (observação: isso redefine o histórico):

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

Abordagem recomendada (Fabric Spark >= 3.2.0.19):

from pyspark.sql.delta import StatisticsStore

StatisticsStore.recomputeStatisticsWithCompaction(spark, "testTable1")

Se o esquema mudar (por exemplo, você adiciona ou elimina colunas), remova estatísticas antigas antes de recomputar:

from pyspark.sql.delta import StatisticsStore

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

Usar ANALYZE TABLE

Use ANALYZE TABLE para calcular estatísticas do catálogo Spark em todas as colunas. Esse comando não recalcula as estatísticas estendidas armazenadas pelas Estatísticas Automatizadas de Tabelas. Para recalcular essas estatísticas, use StatisticsStore.recomputeStatisticsWithCompaction.

Execute o comando:

Execute a seguinte instrução SPARK SQL:

ANALYZE TABLE tableName COMPUTE STATISTICS FOR ALL COLUMNS

Habilitar a injeção de estatísticas de catálogo:

Use esta instrução SQL do Spark para habilitar a injeção de estatísticas de catálogo:

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

Para desabilitar a injeção de estatísticas de catálogo, use a mesma configuração com o valor definido para false.

Limitações

É importante entender as limitações atuais das estatísticas automatizadas do Fabric para que você possa planejar adequadamente.

  • As estatísticas são coletadas somente no momento da gravação.
  • As atualizações de outros mecanismos não são agregadas automaticamente.
  • Somente as primeiras 32 colunas estão incluídas (incluindo as colunas aninhadas).
  • Exclusões e atualizações podem tornar as estatísticas obsoletas. Para tabelas que usam vetores de exclusão, a manutenção regular com OPTIMIZE ou REORG TABLE ... APPLY (PURGE) reescreve os arquivos afetados e atualiza suas estatísticas. Desabilite a injeção de estatísticas entre os ciclos de manutenção em tabelas com atualizações ou excluções frequentes.
  • A recomputação requer uma operação de API de reescrita ou de estatísticas.
  • A injeção de estatísticas não se aplica a colunas aninhadas.
  • Em algumas cargas de trabalho, estatísticas obsoletas ou incompletas podem levar a regressões.
  • ANALYZE TABLE o suporte é limitado a FOR ALL COLUMNS.
  • As alterações de ordenação ou configuração de coluna podem exigir atualização completa.