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
Escolha o tipo de dado certo para otimizar a compressão
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).
posts, sem chave de ordenação.
Uma observação sobre partes compact versus wide
Uma observação sobre partes compact versus wide
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
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:
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.
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
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.
Compressão no ClickHouse Cloud
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.