Analytics em tempo realArmazenamento de dadosObservabilidadeAI/MLCloudOss
Pré-requisitos
- A running ClickHouse Cloud service. If you don’t have one yet, complete the Create your first Cloud service quickstart first.
O que você vai criar
ORDER BY e um PARTITION BY significativos, carregará dados diretamente do S3 e, em seguida, fará uma consulta em system.parts para ver como o ClickHouse organiza fisicamente os dados em disco.
Ao final, você entenderá por que o motor MergeTree é a base de quase todas as tabelas do ClickHouse e como suas decisões de ordenação e particionamento moldam diretamente o desempenho das consultas.
1
Entenda como o MergeTree funciona
Antes de escrever qualquer SQL, é útil entender o que torna o MergeTree diferente de uma tabela de banco de dados tradicional.Quando você insere dados em uma tabela MergeTree, o ClickHouse não grava as linhas uma a uma. Em vez disso, ele grava uma parte de dados — um pequeno bloco de linhas, ordenado e comprimido — diretamente no disco. Depois, o ClickHouse mescla essas partes em segundo plano ao longo do tempo. É daí que vem o nome: merge + tree.Cada parte de dados é ordenada pela expressãoORDER BY da tabela. Essa ordem se torna o índice de chave primária, o que permite ao ClickHouse ignorar grandes blocos de dados que não precisa ler durante uma consulta (isso é chamado de poda de dados). Quanto mais seletivas forem as colunas do seu ORDER BY para as consultas mais comuns, menos dados o ClickHouse lerá.Três cláusulas controlam como o MergeTree organiza seus dados:Agora você já deve conseguir explicar a relação entre partes de dados, a chave primária e o desempenho das consultas em uma tabela MergeTree.
2
Visualize os dados de origem
Antes de criar sua tabela, inspecione o arquivo de origem usando a função de tabelas3. Isso permite consultar o S3 diretamente, sem antes gravar nenhum dado no ClickHouse.Execute o seguinte no Console SQL:Nullable(String). O ClickHouse está lendo um CSV bruto, então ele não sabe quais são os tipos de dados reais — isso é algo que você corrigirá ao definir o esquema da sua tabela no próximo passo.Visualize algumas linhas:id da transação, o price da venda, a date, o type do imóvel, campos de endereço e identificadores geográficos. Você também notará duas colunas no final (column15, column16) que estão vazias — elas podem ser ignoradas.Verifique isso confirmando que você consegue ver linhas com colunas como id, price, date, postcode, type, town e county.3
Defina e crie sua tabela MergeTree
Agora crie uma tabela permanente com um esquema apropriado. Os tipos de coluna abaixo foram escolhidos deliberadamente:LowCardinality(String)é usado para colunas com poucos valores distintos (códigos postais, nomes de cidades, nomes de condados). Ele usa codificação por dicionário internamente, reduz drasticamente o armazenamento e melhora o desempenho de agrupamento e filtragem nessas colunas.Enum8codifica as colunastypeedurationcomo pequenos inteiros em disco, mantendo rótulos de string legíveis nas consultas. O CSV de origem usa códigos de uma única letra, então vamos mapeá-los durante a inserção.PARTITION BY toYYYYMM(date)cria uma partição por mês do calendário, permitindo que o ClickHouse ignore meses inteiros quando a cláusulaWHEREfiltra pordate.ORDER BY (postcode, addr1, addr2)ordena os dados para permitir buscas rápidas por endereço do imóvel — o padrão de acesso mais natural para esse conjunto de dados.
ENGINE = MergeTree, o ClickHouse Cloud criou a tabela com SharedMergeTree('/clickhouse/tables/{uuid}/{shard}', '{replica}'). Isso é esperado — o Cloud converte automaticamente MergeTree em SharedMergeTree, adicionando suporte à replicação e ao armazenamento compartilhado. O comportamento e a interface de consulta permanecem os mesmos.4
Carregar dados do S3
Insira o conjunto de dados completo selecionando diretamente da função de tabelas3(). O ClickHouse transmite o arquivo comprimido do S3 e o grava na sua tabela em partes ordenadas.T para casa geminada, F para propriedade plena, Y/N para imóvel novo), usamos transform para mapeá-los para rótulos legíveis e toUInt32/if para converter as colunas numéricas. As colunas id, column15 e column16 são excluídas, pois não precisamos delas.Isso levará um ou dois minutos, dependendo do tamanho do seu serviço. Quando concluir, confirme a contagem de linhas:5
Inspecione as partes usando system.parts
É aqui que os componentes internos do MergeTree ficam visíveis. A tabelasystem.parts rastreia cada parte de dados no disco de cada tabela MergeTree no seu serviço.partition- o valorYYYYMMderivado da sua expressãoPARTITION BY. Os dados de cada mês ficam isolados.name- o nome da parte codifica a partição, o intervalo de números de bloco e o nível de merge (por exemplo,199501_1_4_2significaria a partição199501, os blocos de 1 a 4 e duas mesclagens).marks- o número de grânulos de índice. Cada grânulo cobre 8.192 linhas por padrão, e o índice de chave primária armazena uma entrada por grânulo. É esse índice esparso que permanece na memória e permite pular dados rapidamente.bytes_on_disk- o ClickHouse comprime cada parte coluna por coluna usando LZ4 por padrão. Compare isso com o tamanho bruto para entender a taxa de compressão.
active = true garante que você veja apenas as partes atuais, já mescladas, em vez de partes mais antigas que ainda estejam aguardando limpeza.6
Consulte os dados e observe o comportamento da chave primária
Agora execute algumas consultas analíticas reais. Primeiro, encontre as vendas de maior valor já registradas:price não faz parte da chave ORDER BY, ClickHouse não pode usar o índice primário para pular dados e precisa fazer uma varredura completa da tabela.Em seguida, encontre o preço médio de venda por condado:county não está em ORDER BY nem em PARTITION BY, então o ClickHouse varre a tabela inteira.Agora execute uma consulta que combina agregação com o seu ORDER BY. Como os dados estão ordenados por (postcode, addr1, addr2), filtrar por um prefixo de código postal permite que o ClickHouse pule a maior parte da tabela. Aqui, encontramos o preço médio de venda por ano para imóveis na área de código postal SW1A:postcode deve ler apenas uma fração das linhas da tabela, demonstrando o índice da chave primária em ação. Compare isso com as consultas anteriores, que fazem uma varredura mais ampla - a diferença mostra por que escolher o ORDER BY correto é importante.