[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