Camada de armazenamento: inserções simultâneas são isoladas umas das outras
Camada de armazenamento: inserts e SELECTs concorrentes são isolados
Camada de armazenamento: computação durante a mesclagem
- Mesclagens de substituição que mantêm apenas a versão mais recente de uma linha nas partes de entrada e descartam todas as demais versões. Esses merges podem ser vistos como uma operação de limpeza durante a mesclagem.
- Mesclagens de agregação que combinam estados intermediários de agregação na parte de entrada em um novo estado de agregação. Embora isso pareça difícil de entender, na prática, isso apenas implementa uma agregação incremental.
- Mesclagens TTL (time-to-live) comprimem, movem ou excluem linhas com base em determinadas regras de tempo.
Camada de armazenamento: poda de dados
- Índices de chave primária, que definem a ordem de ordenação dos dados da tabela. Uma chave primária bem escolhida permite avaliar filtros (como as cláusulas WHERE na consulta acima) usando buscas binárias rápidas em vez de varreduras completas de colunas. Em termos mais técnicos, o tempo de execução dessas varreduras passa a ser logarítmico, em vez de linear em relação ao volume de dados.
- Projeções de tabela, que funcionam como versões alternativas e internas de uma tabela, armazenando os mesmos dados, mas ordenados por uma chave primária diferente. As projeções podem ser úteis quando há mais de uma condição de filtro frequente.
- Índices de salto, que incorporam estatísticas adicionais dos dados às colunas, por exemplo, os valores mínimo e máximo de uma coluna, o conjunto de valores únicos etc. Os índices de salto são ortogonais às chaves primárias e às projeções de tabela e, dependendo da distribuição dos dados na coluna, podem acelerar bastante a avaliação de filtros.
Camada de armazenamento: compressão de dados
Camada de processamento de consultas de última geração
Atenção meticulosa aos detalhes
“ClickHouse is a freak system - you guys have 20 versions of a hash table. You guys have all these amazing things where most systems will have one hash table … ClickHouse has this amazing performance because it has all these specialized components” Andy Pavlo, professor de bancos de dados na CMUO que distingue o ClickHouse dos demais é sua atenção meticulosa à otimização de baixo nível. Criar um banco de dados que simplesmente funcione é uma coisa, mas projetá-lo para entregar velocidade em diversos tipos de consulta, estruturas de dados, distribuições e configurações de índice é onde brilha a arte desse “freak system”. Tabelas hash. Vamos usar uma tabela hash como exemplo. Tabelas hash são estruturas de dados fundamentais usadas em junções e agregações. Como programador, é preciso considerar estas decisões de projeto:
- Qual função hash escolher,
- Como resolver colisões: endereçamento aberto ou encadeamento,
- O layout de memória: um array para chaves e valores ou arrays separados?
- O fator de preenchimento: quando e como redimensionar? Como mover valores durante o redimensionamento?
- Exclusões: a tabela hash deve permitir remover entradas?
- O que será ordenado: números, tuplas, strings ou estruturas?
- Os dados estão na RAM?
- A ordenação precisa ser estável?
- Todos os dados devem ser ordenados ou uma ordenação parcial basta?