Compactação Force Merge no Milvus: como quase dobrar o QPS de busca vetorial
Se você trabalha com busca semântica em escala, sabe que o desempenho de queries é um jogo de detalhes. Um engenheiro documentou recentemente como a compactação Force Merge do Milvus — o banco de dados vetorial open source mais popular — quase dobrou o QPS (queries per second) de seu serviço de busca semântica em produção.
O problema era familiar para quem opera bancos vetoriais: após ingestão em massa de documentos, o sistema acumula pequenos segmentos selados. Cada query precisa se distribuir por todos esses segmentos, incorrendo em custos de scheduling, index lookup e merge de resultados que poderiam ser evitados.
Por que pequenos segmentos se acumulam
O Milvus — como qualquer sistema similar — não sabe quando sua carga de escrita terminou. Um fluxo contínuo de dados, updates incrementais e deleções geram novos segmentos selados a cada operação. Fundir esses segmentos não é grátis: consome I/O, memória e CPU, além de exigir a reconstrução do índice para os dados mesclados. Se o sistema fizesse merge agressivo durante escritas ativas, desperdiçaria recursos. O resultado é a proliferação de segmentos pequenos que degradam a performance de leitura.
A solução: compact() com target_size
A API compact() do Milvus oferece uma opção pouco explorada chamada Force Merge Compaction, acionada pelo parâmetro target_size. A ideia é simples: consolidar múltiplos segmentos pequenos em poucos segmentos maiores, reduzindo o fan-out das queries.
Na prática, o engenheiro configurou a compactação para agrupar segmentos até um tamanho-alvo e observou o QPS quase dobrar. A latência também melhorou, já que menos segmentos significam menos operações de merge na camada de coordenação.
Quando usar (e quando não usar)
A Force Merge Compaction é mais eficaz após cargas em lote — quando você ingeriu um grande volume de documentos e as escritas estabilizaram. Não é recomendada durante ingestão ativa contínua, pois o custo de merge compete com as escritas em andamento.
O ganho real depende da distribuição dos seus dados e do padrão de queries. Mas para workloads de busca semântica com muitas leituras e poucas escritas, é uma otimização de baixo custo com retorno imediato. Basta invocar collection.compact() com o parâmetro target_size adequado ao seu volume de dados e aguardar a conclusão da tarefa.
Em um ecossistema onde cada milissegundo conta — especialmente em aplicações de RAG (Retrieval-Augmented Generation) e chatbots — reduzir pela metade o tempo de busca com uma única chamada de API é o tipo de vitória silenciosa que faz diferença em produção.
Descubra mais sobre noticiAI
Assine para receber nossas notícias mais recentes por e-mail.



