[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