Skip to main content
Um dos segredos do desempenho das consultas no ClickHouse é a compressão. Menos dados em disco significam menos I/O e consultas e inserções mais rápidas. Na maioria dos casos, a sobrecarga de CPU de qualquer algoritmo de compressão é compensada pela redução de I/O. Portanto, melhorar a compressão dos dados deve ser a primeira prioridade ao trabalhar para garantir consultas rápidas no ClickHouse.
Para entender por que o ClickHouse comprime dados tão bem, recomendamos a leitura deste artigo. Em resumo, nosso banco de dados orientado a colunas grava os valores por coluna. Quando esses valores são ordenados, valores idênticos ficam adjacentes uns aos outros, e os algoritmos de compressão aproveitam padrões contíguos nos dados. Além disso, o ClickHouse tem codecs e tipos de dados granulares que permitem ajustar ainda mais a compressão com facilidade.
A compressão no ClickHouse será impactada por 3 fatores principais:
  • A chave de ordenação
  • Os tipos de dados
  • Quais codecs são usados
Todos eles são configurados por meio do esquema.

Escolha o tipo de dado certo para otimizar a compressão

Vamos usar o conjunto de dados do Stack Overflow como exemplo. Vamos comparar as estatísticas de compressão dos seguintes esquemas da tabela posts:
  • posts - Um esquema sem otimização de tipos e sem chave de ordenação.
  • posts_v3 - Um esquema com tipos otimizados, com o tipo e o tamanho em bits adequados para cada coluna, com chave de ordenação (PostTypeId, toDate(CreationDate), CommentCount).
Usando as consultas a seguir, podemos medir o tamanho atual comprimido e não comprimido de cada coluna. Vamos examinar o tamanho do esquema inicial otimizado posts, sem chave de ordenação.
Se você estiver vendo valores de compressed_size ou uncompressed_size iguais a 0, isso pode acontecer porque o tipo das partes é compact, e não wide (veja a descrição de part_type em system.parts). O formato da parte é controlado pelas configurações min_bytes_for_wide_part e min_rows_for_wide_part, o que significa que, se os dados inseridos resultarem em uma parte que não ultrapasse os valores das configurações mencionadas acima, a parte será compact em vez de wide, e você não verá os valores de compressed_size ou uncompressed_size.Para demonstrar:
Consulta
Resposta
Mostramos aqui tanto o tamanho comprimido quanto o não comprimido. Ambos são importantes. O tamanho comprimido corresponde ao que precisaremos ler do disco — algo que queremos minimizar para melhorar o desempenho da consulta (e reduzir o custo de armazenamento). Esses dados precisarão ser descomprimidos antes da leitura. Já o tamanho não comprimido dependerá, neste caso, do tipo de dado usado. Minimizar esse tamanho reduz a sobrecarga de memória das consultas e a quantidade de dados que precisa ser processada pela consulta, melhorando o uso de cache e, em última análise, o tempo de execução das consultas.
A consulta acima depende da tabela columns no banco de dados do sistema. Esse banco de dados é gerenciado pelo ClickHouse e é uma verdadeira mina de informações úteis, desde métricas de desempenho de consultas até logs de cluster em segundo plano. Recomendamos “System Tables and a Window into the Internals of ClickHouse” e os artigos complementares[1][2] para quem quiser se aprofundar.
Para resumir o tamanho total da tabela, podemos simplificar a consulta acima:
Repetindo esta consulta para posts_v3, a tabela com um tipo e uma chave de ordenação otimizados, podemos observar uma redução significativa nos tamanhos não comprimido e comprimido.
A análise completa por coluna mostra uma economia considerável nas colunas Body, Title, Tags e CreationDate, obtida ao ordenar os dados antes da compressão e usar os tipos adequados.

Escolhendo o codec de compressão de coluna adequado

Com codecs de compressão de coluna, podemos alterar o algoritmo (e suas configurações) usado para codificar e comprimir cada coluna. Codificação e compressão funcionam de maneiras ligeiramente diferentes, mas com o mesmo objetivo: reduzir o tamanho dos dados. As codificações aplicam um mapeamento aos dados, transformando os valores com base em uma função que explora propriedades do tipo de dado. Já a compressão usa um algoritmo genérico para comprimir os dados no nível de bytes. Normalmente, as codificações são aplicadas primeiro, antes da compressão. Como diferentes codificações e algoritmos de compressão são eficazes para diferentes distribuições de valores, precisamos entender nossos dados. O ClickHouse oferece suporte a um grande número de codecs e algoritmos de compressão. A seguir, algumas recomendações em ordem de importância: Veja aqui outras opções. Abaixo, especificamos o codec Delta para Id, ViewCount e AnswerCount, partindo da hipótese de que eles terão correlação linear com a chave de ordenação e, portanto, devem se beneficiar da codificação Delta.
As melhorias de compressão dessas colunas são mostradas abaixo:

Compressão no ClickHouse Cloud

No ClickHouse Cloud, usamos por padrão o algoritmo de compressão ZSTD (com valor padrão 1). Embora a velocidade de compressão desse algoritmo possa variar conforme o nível de compressão (quanto maior, mais lento), ele tem a vantagem de manter um desempenho consistentemente rápido na descompressão (com variação de cerca de 20%) e também de poder ser paralelizado. Nossos testes históricos também indicam que esse algoritmo costuma ser suficientemente eficaz e pode até superar o LZ4 combinado com um codec. Ele é eficaz para a maioria dos tipos de dados e distribuições de informações e, por isso, é uma escolha padrão sensata para uso geral — razão pela qual nossa compressão inicial já é excelente mesmo sem otimização.
Última modificação em 3 de julho de 2026