Otimização da query de atualizar mensagem
Bem-vindo!
- [x] Sim, pesquisei solicitações semelhantes no GitHub e não encontrei nenhum.
Qual tipo de recurso?
Outro
Qual a motivação para a solicitação?
O update abaixo gera um table scan sempre que é executada, não sendo possível otimizar a execução com uso de índice. Isso está consumindo muito o banco (o meu esta num servidor com 4 núcleos AMD Epic 7003 dedicados e está usando 100% de todos os núcleos no dia a dia, a tabela de mensagens tem 5 gigas atualmente e o evolution tem 130 instancias).
https://github.com/EvolutionAPI/evolution-api/blob/427c99499394d3894e4b065626323c45e91022e4/src/api/integrations/channel/whatsapp/whatsapp.baileys.service.ts#L4360C1-L4372C8
Query gerada: UPDATE "public"."Message" SET "status" = $1 WHERE (("public"."Message"."key"#>ARRAY[$2]::text[])::jsonb::jsonb = $3 AND ("public"."Message"."key"#>ARRAY[$4]::text[])::jsonb::jsonb = $5 AND "public"."Message"."messageTimestamp" <= $6 AND ("public"."Message"."status" IS NULL OR "public"."Message"."status" = $7))
Exemplos de Uso
Uso em um servidor com 130 instancias do whatsapp-baileys
Como o recurso deve ser desenvolvido?
Vejo dois caminhos. Escrever a query manualmente para poder usar operadores que possuem suporte a índices ou extrair ambos os campos usados para colunas na tabela. A segunda opção é a melhor implementação, pois o índice da coluna é mais eficiente que o do BJson.
Notas Adicionais
Posso realizar a implementação e abrir um PR, a requisição aqui é mais com intuito de discutir qual solução teria o PR aceito pelo projeto.
Comos as correções deve demorar, uma sugestão pra vc (depois vc desfaz):
Cria um índice para a coluna status.
Como os status null e menores que 3 (status pendentes) provavelmente serão bem poucos em relação ao total de mensagens, então vc acelera bastante a query.
o update tá funcionando ? pra mim não dá certo