[firebase-br] Interbase rápido x Firebird muito lento. Me ajudem com esse problema por favor.
Douglas Tosi
douglasht em gmail.com
Qui Maio 14 12:58:35 -03 2009
2009/5/14 Magno System <magno em speet.com.br>:
> Oi Douglas, agora você me fez ficar com dúvida. Se o EXISTS executa 1 select
> para cada registro da tabela principal, no teste do email anterior, seriam
> 28052 SELECT'S do EXISTS contra 1 do IN. Então como se explica o EXISTS ser
> mais rápido ??? Não é ao contrário não ???
Acho que não.
Vamos analisar o teste:
1) P.CODIGO NOT IN (SELECT V.CODIGOPRODUTO FROM VENDAS V)
PLAN (V NATURAL) PLAN (P NATURAL)
Execute time = 3s 455ms
Fetches from cache = 2.757.951
2) NOT EXISTS (SELECT V.CODIGOPRODUTO FROM VENDAS V WHERE
V.CODIGOPRODUTO = P.CODIGO)
PLAN (V INDEX (VENDAS_IDX3)) PLAN (P NATURAL)
Execute time = 20ms
Fetches from cache = 6.984
Veja a diferença no número de Fetches.
No caso 1, para cada produto o subselect tem que ser executado e de
maneira natural encontrar as vendas daquele produto.
O subselect não pode ser executado uma só vez porque o firebird não
tem cursor bidirecional e como não se sabe a ordem em que os produtos
serão pesquisados, o subselect tem que ser executado a cada produto.
Seria interessante testar este caso de "not in" com um order by
p.codigo pra ver se faz diferença.
No caso 2 acontece a mesma coisa. Para cada produto o subselect é
reexecutado. Mas desta vez usando um índice adequado.
hth,
--
Douglas Tosi
www.sinatica.com
Mais detalhes sobre a lista de discussão lista