Compactando tabelas Delta

Os arquivos de tabela delta ficam fragmentados ao longo do tempo. A fragmentação aumenta a sobrecarga de operação de arquivo, reduz a eficiência da compactação e pode limitar o paralelismo do leitor. A compactação reescreve muitos arquivos pequenos em menos arquivos de tamanho certo para que o Spark possa ler e processar dados com mais eficiência.

O OPTIMIZE comando é a operação de compactação primária. Ele agrupa pequenos arquivos em compartimentos visando um tamanho de arquivo ideal e, em seguida, os reescreve para o armazenamento.

Para obter diretrizes para cargas de trabalho cruzadas sobre estratégias de compactação no SQL Analytics Endpoint, no Power BI Direct Lake e no Spark, consulte manutenção e otimização de tabelas para cargas de trabalho cruzadas.

Métodos de compactação

Microsoft Fabric oferece várias abordagens para manter os tamanhos de arquivo ideais nas tabelas Delta:

OPTIMIZE comando

O OPTIMIZE comando é a operação fundamental para compactar tabelas Delta. Ele reescreve arquivos pequenos em arquivos maiores para melhorar o layout de dados nas tabelas Delta.

OPTIMIZE dbo.table_name
Propriedade Description Valor padrão Configuração de sessão
minFileSize Arquivos menores que esse limite são agrupados e reescritos como arquivos maiores. 1073741824 (1 GB) spark.databricks.delta.optimize.minFileSize
maxFileSize Tamanho do arquivo de destino produzido pelo OPTIMIZE comando. 1073741824 (1 GB) spark.databricks.delta.optimize.maxFileSize

OPTIMIZE é idempotente, mas um minFileSize excessivamente grande pode aumentar a amplificação de gravação. Por exemplo, com minFileSize definido como 1 GB, um arquivo de 900 MB pode ser reescrito após uma pequena gravação adicional. Para obter diretrizes automáticas de gerenciamento de tamanho de arquivo, consulte o tamanho do arquivo de destino adaptável.

OPTIMIZE com o Z-Order

Quando você usa a ZORDER BY cláusula, OPTIMIZE reescreve arquivos ativos para que linhas com valores semelhantes sejam colocadas nos mesmos arquivos. O layout colocalizado melhora a ignorar arquivos com filtros seletivos. Use o Z-Order quando:

  • Suas consultas frequentemente filtram em duas ou mais colunas juntas (por exemplo, data + customer_id) e
  • Esses predicados são seletivos o suficiente para que o salto em nível de arquivo reduz o número de arquivos verificados.
OPTIMIZE dbo.table_name ZORDER BY (column1, column2)

OPTIMIZE com ordem V

A cláusula VORDER resulta em que os arquivos destinados à compactação tenham a otimização V-Order aplicada. Para obter mais informações sobre o V-Order, consulte a documentação detalhada.

OPTIMIZE dbo.table_name VORDER

Você pode combinar Z-Order e V-Order em um único comando. O Spark aplica as operações nesta ordem: compactação em bins → ordenação Z → ordenação V.

OPTIMIZE dbo.table_name ZORDER BY (column1, column2) VORDER

O comportamento da ordem V durante OPTIMIZE depende de como você invoca o comando:

Invocação Behavior
OPTIMIZE table VORDER Força a Ordem V em arquivos reescritos, independentemente das configurações de sessão ou tabela.
OPTIMIZE table (sem VORDER palavra-chave) Herda o comportamento de V-Order de TBLPROPERTIES("delta.parquet.vorder.enabled") se estiver definido; caso contrário, recorre à configuração da sessão spark.sql.parquet.vorder.default.

OPTIMIZE com clustering líquido

O clustering líquido é especificado como uma opção de tabela; consulte habilitar o clustering líquido para obter detalhes. Quando o "liquid clustering" está habilitado, OPTIMIZE executa a reescrita física que implementa a política de "liquid clustering".

Importante

Os dados só são clusterizados quando OPTIMIZE é executado em tabelas com clusterização líquida habilitada. As operações de gravação regulares NÃO clusterizam os dados. Ter uma estratégia de compactação, como usar a compactação automática ou agendar manualmente trabalhos de otimização, é essencial para garantir que os benefícios dos dados clusterizados (ou seja, o salto de arquivo Delta aprimorado) possam ser realizados.

Otimização rápida

A otimização rápida analisa de forma inteligente os arquivos de tabela Delta e ignora as operações de compactação que provavelmente não melhorarão o desempenho de forma significativa.

Em vez de compactar arquivos cegamente sempre que há arquivos pequenos, a otimização rápida avalia se cada compartimento candidato (grupo de arquivos pequenos) atende às metas de compactação de prática recomendada configuráveis. O Fast Optimize só executa a compactação em um compartimento de arquivos se a mesclagem deles provavelmente atingirá seu tamanho mínimo de destino ou se houver muitos arquivos pequenos. Caso contrário, ele ignora esse grupo ou reduz quantos arquivos ele compacta.

SET spark.microsoft.delta.optimize.fast.enabled = TRUE

A otimização rápida pode ser ajustada com base nas expectativas de compactação:

Propriedade Description Valor padrão Configuração de sessão
minNumFiles O número de arquivos pequenos que precisam existir em um agrupamento para que a otimização seja executada, caso o agrupamento não contenha dados suficientes estimados para produzir um arquivo compactado. 50 spark.microsoft.delta.optimize.fast.minNumFiles
parquetCoefficient Multiplicado pelo tamanho mínimo de arquivo no contexto otimizado para determinar a quantidade mínima de pequenos dados de arquivo que devem existir em um receptáculo para que ele seja incluído no escopo da compactação. 1.3 spark.microsoft.delta.optimize.fast.parquetCoefficient

Observação

Os parquetCoefficient resulta em o tamanho de destino de uma partição ser maior do que o tamanho mínimo de destino do contexto de otimização. Esse coeficiente considera que a combinação de vários pequenos arquivos parquet resulta em melhor compactação e, assim, em menos dados do que a soma dos pequenos arquivos. Aumente o valor para tornar mais conservadora a frequência com que a otimização rápida ignora bins, ou diminua-o para permitir uma omissão mais permissiva de bins.

Como funciona

A otimização rápida introduz verificações extras antes que as lixeiras sejam compactadas. Para cada compartimento candidato, o "fast optimize" avalia:

  • A quantidade estimada de dados brutos no compartimento (soma de tamanhos de arquivo pequenos)
  • Se a combinação dos arquivos pequenos é estimada para produzir um arquivo que atende ao tamanho mínimo de destino configurado
  • Se o compartimento contém pelo menos o número mínimo configurado de arquivos pequenos

A otimização rápida avalia cada bin de arquivos pequenos e compacta apenas os bins com probabilidade de atingir o tamanho mínimo alvo ou exceder o número mínimo de arquivos. As lixeiras que não atendem a esses limites são ignoradas ou parcialmente compactadas. Ignorar bins subótimos reduz regravações desnecessárias, diminui a amplificação de gravação e torna os trabalhos "OPTIMIZE" mais idempotentes.

Captura de tela mostrando a velocidade com que a otimização é avaliada se uma lixeira está compactada.

Observação

A implementação exata está sujeita a evoluir ao longo do tempo.

A otimização rápida pode reduzir os dados reescritos em um ciclo de vida da tabela Delta. Conforme mostrado no diagrama a seguir, a otimização rápida ignora bins subótimos, resultando em trabalhos OPTIMIZE mais rápidos e idempotentes com menos amplificação de gravação.

Captura de tela mostrando a rapidez com que a otimização resulta em menos reescrita de dados ao longo do tempo.

Observação

Somente para fins ilustrativos, os diagramas acima pressupõem que o tamanho do arquivo gravado da compactação é a soma do tamanho dos arquivos pequenos. Também implica um parquetCoefficient de 1.

Limitações
  • Não aplicável ao agrupamento líquido e às operações Z-Order
  • A otimização rápida não modifica o comportamento da compactação automática

Objetivos de compactação no nível do arquivo

Para evitar a reescrita de dados que antes eram considerados compactados (grandes o suficiente) com base na alteração dos destinos de tamanho de arquivo mínimo e máximo de compactação, spark.microsoft.delta.optimize.fileLevelTarget.enabled pode ser habilitado para impedir a recompilação de arquivos já compactados. Quando habilitado, os arquivos não serão recompactados se anteriormente já tiverem atendido pelo menos a metade do tamanho-alvo no momento da compactação. A manutenção de alvos no nível de arquivo minimiza a amplificação de gravação à medida que o tamanho do arquivo alvo de compactação é alterado ao longo do tempo (por exemplo, ao avaliar e definir um tamanho de arquivo maior a partir de um tamanho de arquivo alvo adaptável). Se estiver habilitada, a marca OPTIMIZE_TARGET_SIZE será adicionada a novos arquivos quando OPTIMIZE for executado ou em qualquer operação de gravação, se a propriedade delta.targetFileSize ou a propriedade da tabela delta.targetFileSize.adaptive estiver definida.

Observação

Embora não esteja habilitada por padrão, a Microsoft recomenda habilitar destinos de compactação no nível do arquivo para limitar a potencial amplificação de gravação.

SET spark.microsoft.delta.optimize.fileLevelTarget.enabled = TRUE

Compactação automática

A compactação automática avalia a integridade da partição após cada operação de gravação. Quando detecta fragmentação excessiva de arquivo (muitos arquivos pequenos) dentro de uma partição, ela dispara uma operação síncrona OPTIMIZE imediatamente após a gravação ser confirmada. Essa abordagem orientada pelo autor para a manutenção de arquivos é ideal porque a compactação só é executada quando determinada programaticamente que seja benéfica.

Habilitar no nível da sessão

Defina spark.databricks.delta.autoCompact.enabled no nível da sessão para habilitar a compactação automática para novas tabelas criadas nessa sessão do Spark:

SET spark.databricks.delta.autoCompact.enabled = TRUE

Habilitar no nível da tabela

Defina a propriedade delta.autoOptimize.autoCompact da tabela para habilitar a compactação automática para tabelas específicas:

CREATE TABLE dbo.table_name
TBLPROPERTIES ('delta.autoOptimize.autoCompact' = 'true')

Use a opção delta.autoOptimize.autoCompact do DataFrameWriter para habilitar a compactação automática ao criar uma tabela:

df.write.option('delta.autoOptimize.autoCompact', 'true').saveAsTable('dbo.table_name')

Habilite a mesma propriedade de tabela em uma tabela existente:

ALTER TABLE dbo.table_name
SET TBLPROPERTIES ('delta.autoOptimize.autoCompact' = 'true')

Reduzir a sobrecarga de avaliação

A partir do Fabric Spark Runtime 2.0 (Delta 4.1), você pode habilitar o modo de compactação automática onCheckpointOnly. Por padrão, a compactação automática avalia os metadados de arquivo após cada operação de gravação para determinar se uma tabela tem muitos arquivos pequenos. Com onCheckpointOnly, a avaliação é adiada para as operações de checkpoint do log (normalmente a cada 10 commits). No momento do ponto de verificação, o instantâneo da tabela já está totalmente reconstruído, portanto, a avaliação lê os metadados que já estão na memória em vez de exigir uma verificação extra. A avaliação diferida reduz a sobrecarga por commit, sem deixar de garantir que as tabelas sejam compactadas periodicamente.

SET spark.microsoft.delta.autoCompact.onCheckpointOnly.enabled = TRUE