Partilhar via


OPTIMIZE

Aplica-se a:com marca de verificação sim Databricks SQL com marca de verificação sim Databricks Runtime

Esta página descreve o OPTIMIZE comando, que otimiza a disposição dos dados do Delta Lake. Pode otimizar um subconjunto de dados ou colocar dados por coluna. Se não especificares colocação e a tabela não usar clustering líquido, a Delta Lake realiza otimização bin-packing.

Sintaxe

OPTIMIZE table_name [FULL] [WHERE predicate]
  [ZORDER BY (col_name1 [, ...] ) ]

Nota

A optimização bin-packing é idempotente: se a executares duas vezes no mesmo conjunto de dados, a segunda execução não tem efeito. Produz ficheiros de dados equilibrados de forma uniforme em relação ao seu tamanho no disco, mas não necessariamente o número de tuplas por ficheiro. As duas medidas são mais frequentemente correlacionadas.

A Ordenação Z não é idempotente, mas opera de forma incremental. O tempo que a Ordenação Z demora não é garantido que diminua ao longo de várias corridas. No entanto, se não foram adicionados novos dados a uma partição que foi apenas Z-Ordered, executar novamente Z-Ordering nessa partição não tem efeito. A Ordenação Z produz ficheiros de dados equilibrados de forma uniforme em relação ao número de tuplas, mas não necessariamente ao tamanho dos dados no disco. As duas medidas estão mais frequentemente correlacionadas, mas pode ocorrer um desvío nos tempos de otimização das tarefas quando divergem.

Nota

Ao usar o Databricks Runtime, para controlar o tamanho do ficheiro de saída, defina a configuração spark.databricks.delta.optimize.maxFileSizedo Spark. O valor padrão é 1073741824 (1 GB). Especificar 104857600 define o tamanho do ficheiro para 100 MB.

Parâmetros

  • table_name

    Identifica uma tabela Delta existente. O nome não deve incluir uma especificação temporal ou uma especificação de opções.

  • FULL

    Aplica-se a: marcado com sim Databricks Runtime 16.0 e versões superiores

    Reescreve todos os arquivos de dados na tabela. Use OPTIMIZE table_name FULL para:

    • Otimize toda a tabela, incluindo dados que estavam previamente agrupados (para tabelas que usam agrupamento líquido).
    • Recompacte os arquivos de dados existentes quando você alterar o codec de compactação da tabela usando a delta.parquet.compression.codec propriedade.

    Para recomprimir dados existentes após alterar o codec de compressão, execute OPTIMIZE table_name FULL:

    -- Change compression codec
    ALTER TABLE table_name SET TBLPROPERTIES ('delta.parquet.compression.codec' = 'ZSTD');
    
    -- Recompress all existing data files
    OPTIMIZE table_name FULL;
    

    Para otimizar um subconjunto de ficheiros numa tabela com clustering líquido ativado, combine FULL com um WHERE predicado (Databricks Runtime 18.1 e superior). Apenas são suportados predicados simples de intervalo numa única coluna de agrupamento. Um ficheiro é incluído se qualquer parte do seu alcance coincidir com o predicado. Por exemplo, OPTIMIZE events FULL WHERE date > 15 inclui um ficheiro com alcance (col_min = 10, col_max = 20) porque o intervalo do ficheiro se sobrepõe ao predicado.

  • WHERE

    Otimiza o subconjunto de linhas que correspondem a um predicado de partição/clustering. Apenas são suportados filtros nos atributos da chave de partição/clustering.

    Para tabelas que usam cluster líquido, use OPTIMIZE table_name FULL WHERE predicate (Databricks Runtime 18.1 e superior) em vez disso.

  • ZORDER BY

    Coloca a informação das colunas no mesmo conjunto de ficheiros. Os algoritmos de salto de dados de Delta Lake usam co-localidades para reduzir a quantidade de dados que precisam de ser lidos. Pode especificar múltiplas colunas como uma lista separada por vírgulas, mas a eficácia da co-localidade diminui a cada coluna adicional.

    Não podes usar esta cláusula em tabelas que usam clustering líquido.

Exemplos

> OPTIMIZE events;

> OPTIMIZE events FULL;

> -- Partitioned table
> OPTIMIZE events WHERE date >= '2017-01-01';

> -- Table with liquid clustering enabled (DBR 18.1 and above)
> OPTIMIZE events FULL WHERE date >= '2025-01-01';

> OPTIMIZE events
    WHERE date >= current_timestamp() - INTERVAL 1 day
    ZORDER BY (eventType);

Para mais informações, consulte Otimizar layout de ficheiros de dados.