Estou tentando otimizar uma consulta como:
UPDATE master SET count =
(SELECT COUNT(*) FROM detail WHERE detail.master_id=master.id)
Onde a tabela principal é grande, executar isso resulta em uma enorme varredura sequencial. Por outro lado, essa contagem não muda com tanta frequência, então minha ideia é reescrever assim:
UPDATE master SET count =
(SELECT COUNT(*) FROM detail WHERE detail.master_id=master.id)
WHERE count !=
(SELECT COUNT(*) FROM detail WHERE detail.master_id=master.id)
EXPLAIN me diz que isso resulta em dois subplanos, o que eu esperaria. Existe uma maneira de evitar os dois subplanos executados?
Uma tentativa de reescrever o acima como
UPDATE master SET count =
(SELECT COUNT(*) FROM detail WHERE detail.master_id=master.id) AS cnt
WHERE count != cnt
falha com erro de sintaxe em "AS".
Isso deve ser mais rápido:
Isso pressupõe que
master.id
é único.