DBMS colunar de alta performance para processamento analítico online
ClickHouse é um sistema de gerenciamento de banco de dados (DBMS) colunar de código aberto para processamento analítico online (OLAP). Desenvolvido para fornecer consultas ultra-rápidas em grandes volumes de dados, ClickHouse pode processar bilhões de registros em milissegundos.
Desenvolvido pela Yandex em 2009 para análise de dados de web analytics e posteriormente open-sourced em 2016. ClickHouse foi projetado desde o início para lidar com cargas de trabalho analíticas extremamente exigentes, processando trilhões de registros por dia no Yandex.Metrica.
ClickHouse utiliza uma arquitetura colunar otimizada:
Consultas em bilhões de registros em milissegundos
Redução de 90% no espaço de armazenamento
Otimizado para consultas analíticas
Inserção de dados em tempo real com alta throughput
MergeTree | Engine principal para dados analíticos |
ReplacingMergeTree | Remove duplicatas durante merge |
SummingMergeTree | Agrega valores durante merge |
AggregatingMergeTree | Armazena estados de agregação |
Distributed | Distribui dados entre múltiplos shards |
Análise de eventos de websites com bilhões de pageviews.
Dashboards operacionais com atualizações em tempo real.
Análise de logs de aplicações e infraestrutura.
Análise de transações financeiras e detecção de fraudes.
Processamento de dados de sensores IoT em tempo real.
CREATE TABLE events (
timestamp DateTime,
user_id UInt64,
event_type String,
page_url String,
country String,
device_type String,
session_duration UInt32
) ENGINE = MergeTree()
PARTITION BY toYYYYMM(timestamp)
ORDER BY (timestamp, user_id)
SETTINGS index_granularity = 8192;
SELECT
toStartOfHour(timestamp) as hour,
country,
device_type,
count() as events,
uniq(user_id) as unique_users,
avg(session_duration) as avg_duration
FROM events
WHERE timestamp >= now() - INTERVAL 24 HOUR
AND event_type = 'page_view'
GROUP BY hour, country, device_type
ORDER BY hour DESC, events DESC
LIMIT 1000;
INSERT INTO events VALUES
('2024-01-15 10:30:00', 12345, 'page_view', '/home', 'US', 'mobile', 45),
('2024-01-15 10:30:01', 12346, 'click', '/product/123', 'BR', 'desktop', 120),
('2024-01-15 10:30:02', 12347, 'purchase', '/checkout', 'UK', 'tablet', 300);
-- Ou inserção de arquivo
INSERT INTO events
FROM INFILE 'events.csv'
FORMAT CSV;
-- Criar tabela para agregações
CREATE TABLE daily_stats (
date Date,
country String,
total_events UInt64,
unique_users UInt64
) ENGINE = SummingMergeTree()
ORDER BY (date, country);
-- Criar materialized view
CREATE MATERIALIZED VIEW daily_stats_mv TO daily_stats AS
SELECT
toDate(timestamp) as date,
country,
count() as total_events,
uniq(user_id) as unique_users
FROM events
GROUP BY date, country;
Aspecto | ClickHouse | Trino | BigQuery | Snowflake |
---|---|---|---|---|
Latência | Muito Baixa (ms) | Baixa (segundos) | Baixa (segundos) | Baixa (segundos) |
Throughput | ⭐⭐⭐⭐⭐ | ⭐⭐⭐⭐ | ⭐⭐⭐⭐⭐ | ⭐⭐⭐⭐ |
Compressão | ⭐⭐⭐⭐⭐ | ⭐⭐⭐ | ⭐⭐⭐⭐ | ⭐⭐⭐⭐ |
Real-time Ingestion | ⭐⭐⭐⭐⭐ | ⭐⭐ | ⭐⭐⭐ | ⭐⭐⭐ |
Custo | Muito Baixo | Baixo | Médio | Alto |