Voltar
Flamegraph of a CPU profiling, showing the logical plan computation taking 12% of the total time and the physical plan computation taking 50% of the total time.

Point queries no DataFusion: boas práticas para buscas de linha única com baixa latência

Aprofundamento CEVIU

Aprofundamento

O texto de Nuno Faria (INESC TEC), publicado em 24 de outubro de 2026, parte de uma palestra no meetup de DataFusion em Boston, em setembro de 2026. O objetivo é fazer point reads terminarem em menos de 1 ms. O teste usa um único arquivo Parquet com 100 milhões de linhas, colunas k (bigint, único) e v (varchar, md5 da chave), numa VM c4d-standard-4 com disco de 6k IOPS.

No armazenamento, o maior ganho vem da ordenação por chave: a versão ordenada teve throughput 6000x maior, lendo uma página em um row group, contra em média 67 row groups e 122 páginas no arquivo desordenado. Também ajudam desligar dictionary encoding (a chave tem muitos valores distintos) e manter sem bloom filters (min/max já bastam). O melhor ponto para lookups ficou perto de 128k linhas por row group e 1k por página, longe dos padrões (1M e 20k). Para atender também análise, 2k a 4k linhas por página funcionou bem. Em compressão, lz4 é mais rápido e zstd tem o melhor equilíbrio.

Na execução, target_partitions igual a 1 favorece leituras pequenas, enquanto leituras grandes (10M linhas) preferem paralelismo. O pushdown_filters ajudou em leituras pequenas e grandes, mas segue desligado por padrão porque piora algumas consultas. O cache de metadados vem ativo desde a versão 50.0.0 (limite padrão de 50MB). Em prepared statements, o DataFusion só reaproveita o plano lógico. Um protótipo que reutiliza o plano físico dobrou ou triplicou o throughput, mas ainda não existe no projeto.

Por que isso importa

Para quem opera DataFusion como camada de consulta sobre Parquet, a leitura é que dá para atender buscas por chave sem outro banco, desde que o arquivo seja escrito já pensando nisso. Ordenação e tamanho de página custam pouco na escrita e rendem muito na leitura. O ponto de atenção é que várias configurações dependem da carga, então vale medir com o seu padrão de acesso.

Perguntas frequentes

Por que ordenar o Parquet pela chave faz tanta diferença em point queries?

O DataFusion usa estatísticas de mínimo e máximo por row group e página para decidir o que ler. Com o arquivo ordenado, os intervalos são estreitos e só uma página precisa ser acessada. No teste, o arquivo desordenado exigiu em média 67 row groups e 122 páginas.

Quais tamanhos de row group e página são melhores para buscas de linha única?

No benchmark, valores perto de 128k linhas por row group e 1k por página foram os melhores. Os padrões do DataFusion são 1M e 20k. Se o mesmo arquivo atende análise e lookups, 2k a 4k linhas por página deram bom resultado nos dois casos.

Vale usar target_partitions igual a 1?

Para leituras pequenas, sim, porque evita o custo de coalescer partições extras. Para leituras grandes, como 10M linhas, o paralelismo padrão é mais rápido. Dá para alterar em tempo de execução com SET datafusion.execution.target_partitions.

Os prepared statements do DataFusion reaproveitam o plano físico?

Hoje não, só o plano lógico. O autor testou um protótipo que cacheia o plano físico e obteve de 2x a 3x mais throughput. Essa versão ainda não está disponível no DataFusion.

Fontes

Avalie este artigo:
Categoria
CEVIU Dados
Publicado
29 de outubro de 2026
Editoria
CEVIU Dados

Quer receber mais sobre CEVIU Dados?

Conteúdo curado diariamente, direto no seu e-mail.

Conteúdo curado diariamenteDiversas categoriasCancele quando quiser