[firebase-br] Interbase rápido x Firebird muito lento. Me ajudem com esse problema por favor.

Magno System magno em speet.com.br
Qui Maio 14 13:32:22 -03 2009


Como a gente aprende. Acho que uma boa opção é ordenar o subselect pelo 
campo que está sendo comparado com o select principal. Veja como o número de 
fetches caiu.

SELECT P.CODIGO FROM PRODUTOS P WHERE NOT EXISTS (SELECT V.CODIGOPRODUTO 
FROM VENDAS V WHERE V.CODIGOPRODUTO = P.CODIGO ORDER BY V.CODIGOPRODUTO)

Plan
PLAN (V ORDER VENDAS_IDX3 INDEX (VENDAS_IDX3))
PLAN (P NATURAL)

Adapted Plan
PLAN (V ORDER VENDAS_IDX3 INDEX (VENDAS_IDX3)) PLAN (P NATURAL)

------ Performance info ------
Prepare time = 10ms
Execute time = 30ms
Avg fetch time = 3,33 ms
Current memory = 9.234.556
Max memory = 9.477.944
Memory buffers = 2.048
Reads from disk to cache = 0
Writes from cache to disk = 0
Fetches from cache = 9.945



----- Original Message ----- 
From: "Douglas Tosi" <douglasht em gmail.com>
To: "FireBase" <lista em firebase.com.br>
Sent: Thursday, May 14, 2009 12:58 PM
Subject: Re: [firebase-br]Interbase rápido x Firebird muito lento. Me ajudem 
com esse problema por favor.


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

______________________________________________
FireBase-BR (www.firebase.com.br) - Hospedado em www.locador.com.br
Para saber como gerenciar/excluir seu cadastro na lista, use: 
http://www.firebase.com.br/fb/artigo.php?id=1107
Para consultar mensagens antigas: http://firebase.com.br/pesquisa


--------------------------------------------------------------------------------



No virus found in this incoming message.
Checked by AVG - www.avg.com
Version: 8.0.238 / Virus Database: 270.12.27/2112 - Release Date: 05/13/09 
07:04:00





Mais detalhes sobre a lista de discussão lista