Ordene por cardinalidade (da menor para a maior)
A granularidade do tempo importa
runnable editable
Foque em consultas individuais, não em médias
Memória e varredura de linhas
GROUP BY user_id, error_message, url_path cria um estado separado na memória para cada combinação única dos três valores. Com uma carga maior de usuários, tipos de erro e caminhos de URL, você pode facilmente gerar milhões de estados de agregação que precisam ser mantidos na memória simultaneamente.
Para casos extremos, a Sentry usa amostragem determinística. Uma amostra de 10% reduz o uso de memória em 90%, mantendo cerca de 5% de precisão para a maioria das agregações:
cityHash64() produz valores de hash consistentes para a mesma entrada, então user_id = 12345 sempre resultará no mesmo valor de hash, garantindo que esse usuário sempre apareça na sua amostra de 10% ou nunca apareça — sem alternar entre consultas.
Otimização de máscara de bits do Sentry
Fontes de vídeo
- Perdido no Palheiro - Otimizando Agregações de Alta Cardinalidade - lições da Sentry em produção sobre otimização de memória
- Análise de Desempenho do ClickHouse - Alexey Milovidov sobre metodologia de depuração
- Meetup do ClickHouse: Técnicas de Otimização de Consultas - estratégias de otimização da comunidade