Tecnologias/02 - Bancos de Dados/04 - Colunares/02 - DuckDB2 min
Armazenamento Colunar e Execução no DuckDB
Armazenamento colunar
Uma organização por linhas aproxima os campos de cada registro. Uma organização colunar aproxima os valores de uma mesma coluna, dentro de blocos de armazenamento.
Dados lógicos:
pedido 1: categoria=livros, valor=40
pedido 2: categoria=livros, valor=60
Visão por coluna:
categoria: [livros, livros]
valor: [40, 60]
Essa ilustração não representa o arquivo byte a byte. O DuckDB divide tabelas em row groups e organiza os dados de cada coluna em blocos, com compressão. Uma coluna inteira não precisa ocupar uma única região contígua do arquivo. Referência: organização física.
Execução vetorizada
Os operadores trabalham com lotes de valores, chamados vetores, agrupados em data chunks. Assim, uma operação pode aplicar um filtro ou cálculo a muitos valores por etapa, reduzindo o custo de coordenação repetido para cada linha.
Armazenamento colunar descreve a disposição dos dados; execução vetorizada descreve como o motor os processa. São mecanismos relacionados, mas distintos. Referência: formato de execução.
Evitar trabalho desnecessário
- Projection pushdown: ler somente as colunas necessárias.
- Filter pushdown: aplicar filtros próximos da leitura, quando possível.
- Zone maps: estatísticas como mínimo e máximo que permitem descartar grupos incompatíveis com certos filtros.
Em uma consulta que soma valor apenas para determinada data, o motor pode evitar
colunas como descricao e grupos de dados fora do intervalo. O ganho depende da
organização dos dados, dos metadados e do filtro.
Referência: leitura e filtros em Parquet.
Memória e disco
Operações suportadas podem usar arquivos temporários quando seus dados intermediários não cabem na memória. Esse spill para disco permite executar determinadas cargas maiores que a RAM, mas acrescenta leitura e escrita. Nem toda consulta ou combinação de operadores terá o mesmo comportamento; ainda pode ocorrer falta de memória. Referência: ajuste de cargas.
Aprofundamento aplicado
Zone maps dependem de como os valores se agrupam
Imagine três blocos de datas: janeiro, fevereiro e março. Um filtro por fevereiro pode descartar os outros dois pelo mínimo e máximo. Se todos os blocos misturam datas de janeiro a março, os mesmos metadados descartam menos trabalho.
Isso explica por que ordenar dados pode melhorar consultas seletivas sem mudar o SQL. O custo de ordenar e reescrever deve ser comparado ao ganho acumulado nas leituras futuras.
Operadores intermediários também consomem memória
Ler duas colunas de um arquivo enorme pode ser barato, mas construir um hash com milhões de grupos distintos pode dominar a memória. Cardinalidade do agrupamento e tamanho do resultado importam tanto quanto o volume de entrada. Spill usa disco temporário para operações suportadas e ainda depende de espaço e desempenho desse disco. Referência: ajuste de cargas.
Exercício: compare GROUP BY categoria e GROUP BY identificador_unico.
Resultado esperado: a segunda consulta cria muito mais grupos, mesmo lendo um
conjunto parecido de colunas; explique a diferença no estado intermediário.
Relacionado: 1. DuckDB · 3. Parquet e S3 com DuckDB · 1. ClickHouse.
Parte de DuckDB