Na maioria dos casos, você não precisa de uma chave de partição e, na maior parte dos demais, também não precisa de uma chave de partição mais granular do que mensal, a menos que esteja lidando com um caso de uso de observabilidade em que o particionamento diário é comum.Nunca use um particionamento granular demais. Não particione seus dados por identificadores ou nomes de clientes. Em vez disso, use o identificador ou o nome do cliente como a primeira coluna na expressão ORDER BY.
PARTITION BY expr ao criar uma tabela. A chave de partição pode ser qualquer expressão baseada nas colunas da tabela. Por exemplo, para especificar o particionamento por mês, use a expressão toYYYYMM(date_column):
Uma mesclagem só funciona para partes de dados que tenham o mesmo valor para a expressão de particionamento. Isso significa que você não deve criar partições granulares demais (mais de cerca de mil partições). Caso contrário, a consulta
SELECT tem um desempenho ruim devido a um número excessivamente grande de arquivos no sistema de arquivos e de descritores de arquivo abertos.visits com particionamento por mês. Vamos executar a consulta SELECT na tabela system.parts:
partition contém os nomes das partições. Há duas partições neste exemplo: 201901 e 201902. Você pode usar o valor dessa coluna para especificar o nome da partição em consultas ALTER … PARTITION.
A coluna name contém os nomes das partes de dados da partição. Você pode usar esta coluna para especificar o nome da parte na consulta ALTER ATTACH PART.
Vamos detalhar o nome da parte: 201901_1_9_2_11:
201901é o nome da partição.1é o número mínimo do bloco de dados.9é o número máximo do bloco de dados.2é o nível do fragmento (a profundidade da árvore de mesclagem da qual ele é formado).11é a versão da mutação (se uma parte tiver sido modificada por mutação)
As partes de tabelas do tipo antigo têm o nome:
20190117_20190123_2_2_0 (data mínima - data máxima - número mínimo do bloco - número máximo do bloco - nível).active mostra o status da parte. 1 é ativo; 0 é inativo. As partes inativas são, por exemplo, partes de origem que permanecem após serem mescladas em uma parte maior. As partes de dados corrompidas também são indicadas como inativas.
Como você pode ver no exemplo, há várias partes separadas da mesma partição (por exemplo, 201901_1_3_1 e 201901_1_9_2). Isso significa que essas partes ainda não foram mescladas. O ClickHouse mescla periodicamente as partes de dados inseridas, aproximadamente 15 minutos após a inserção. Além disso, você pode executar uma mesclagem não agendada usando a consulta OPTIMIZE. Exemplo:
/var/lib/clickhouse/data/<database>/<table>/. Por exemplo:
detached contém partes que foram desanexadas da tabela usando a consulta DETACH. As partes corrompidas também são movidas para esse diretório, em vez de serem excluídas. O servidor não usa as partes do diretório detached. Você pode adicionar, excluir ou modificar os dados nesse diretório a qualquer momento – o servidor não saberá disso até que você execute a consulta ATTACH.
Observe que, em um servidor em execução, você não pode alterar manualmente o conjunto de partes nem os dados delas no sistema de arquivos, já que o servidor não saberá disso. Para tabelas não replicadas, você pode fazer isso quando o servidor estiver parado, mas isso não é recomendado. Para tabelas replicadas, o conjunto de partes não pode ser alterado em hipótese alguma.
O ClickHouse permite executar operações nas partições: excluí-las, copiá-las de uma tabela para outra ou criar um backup. Veja a lista de todas as operações na seção Manipulação de partições e partes.
Otimização do GROUP BY usando a chave de partição
O desempenho de uma consulta desse tipo depende do layout da tabela. A otimização é habilitada por padrão desde a versão 26.7; heurísticas de runtime a ignoram automaticamente quando o layout das partições é desfavorável — especificamente, quando há poucas partições (menos de
max_threads / 2), partições demais (mais de max_number_of_partitions_for_independent_aggregation) ou quando os tamanhos das partições são muito desiguais (a maior partição contém mais linhas do que o dobro do número total de linhas dividido por max_threads). A lista abaixo descreve os fatores de layout para um bom desempenho em geral; desses, apenas a contagem de partições e a desigualdade de tamanho são consideradas pelas heurísticas de runtime.- o número de partições envolvidas na consulta deve ser suficientemente grande (mais de
max_threads / 2); caso contrário, a consulta subutilizará a máquina - as partições não devem ser pequenas demais, para que o processamento em lote não se degrade para um processamento linha por linha
- as partições devem ter tamanhos comparáveis, para que todas as threads realizem aproximadamente a mesma quantidade de trabalho
Recomenda-se aplicar uma função hash às colunas da cláusula
partition by para distribuir os dados de maneira uniforme entre as partições.allow_aggregate_partitions_independently- controla se o uso da otimização está habilitadoforce_aggregate_partitions_independently- força seu uso quando ele é aplicável do ponto de vista da corretude, mas acaba sendo desabilitado pela lógica interna que avalia sua conveniênciamax_number_of_partitions_for_independent_aggregation- limite rígido para o número máximo de partições que a tabela pode ter