trilha

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

Buscar

Busca por título, seção e texto das notas