Preciso de sugestões/ideias para otimizar a seguinte consulta:
SELECT COUNT(*)
FROM (SELECT 1
FROM f
WHERE parent_sha256 = $1
AND parent_sha256 <> sha256
LIMIT 1) AS row_count;
O que é necessário para verificar se um parent_sha256 específico tem algum filho direto. A tabela é muito grande (50 milhões de linhas) e a consulta é muito lenta (6 a 12 minutos) quando há 700 mil a 900 mil linhas correspondentes, parent_sha256 = $1
mas 0 linhas correspondentes parent_sha256 = $1 AND parent_sha256 <> sha256
.
Nesse caso, o banco de dados deve ultrapassar todos os 700k ~ 900k.
Vale ressaltar que existem índices em parent_sha256
e sha256
.
O índice parcial fornecido por Laurenz tem enorme impacto.
Para abordar "além de usar o índice": simplifique a consulta complicada para obter pequenas melhorias adicionais.
Retorna
true
/false
em vez de1
/0
no seu original.Se
true
/ "no row" funcionar para você:Use um índice condicional:
O truque aqui é que o executor não precisa avaliar a condição dispendiosa
parent_sha256 <> sha256
(o que requer a observação de todas as linhas que satisfazemparent_sha256 = $1
), porque as linhas que não atendem à condiçãoparent_sha256 <> sha256
não são indexadas e são automaticamente ignoradas pela varredura do índice.