[firebase-br] Consulta demorando 2 horas como resolvo.

Luciano franca luapfirebird em yahoo.com.br
Qui Jun 2 11:53:23 -03 2011


Colega o codigo dessa forma não roda eu modifiquei ele mais o resultado é o mesmo demora mesma coisa.
na verdade eu acredito que já sei o que está acontecendo o Firebird deve ter algum Bug relacionado a Exists em Sub-Select pois é como se ele ignorasse o Exists e usasse IN

veja o codigo que eu fiz

select cm.codigo, cm.codigo_barras, cm.codigo_fabricante, cm.cod_fornecedor, cm.mercadoria, cf.fornecedor,


 Max(Case When(Gp.filial = 1) Then Gp.preco_g_vista End) As Preco_AS,

 Max(Case When(Gp.filial = 2) Then Gp.preco_g_vista End) As Preco_MT

 from cadastro_mercadorias cm

 inner join cadastro_fornecedor cf on (cf.codigo = cm.cod_fornecedor)

 Inner Join grade_produtos GP on (Gp.cod_produto = CM.codigo)

 Where exists (select cc.Codigo, count(*) from cadastro_mercadorias cc

 where cc.codigo_barras = cm.codigo_barras

 group by 1 having count(*) > 1)  // tive que colocar o cc.Codigo acima devido o Group By 

 group by 1, 2, 3, 4, 5, 6         

 order by  cm.codigo_barras


--- Em qui, 2/6/11, Sandro Souza <escovadordebits em gmail.com> escreveu:

De: Sandro Souza <escovadordebits em gmail.com>
Assunto: Re: [firebase-br] Consulta demorando 2 horas como resolvo.
Para: "FireBase" <lista em firebase.com.br>, "Luciano franca" <luapfirebird em yahoo.com.br>
Data: Quinta-feira, 2 de Junho de 2011, 11:08

Bom dia/tarde Luciano.

Realmente é uma excelente questão. E também confesso que estou curioso a esse respeito.

Só por desencargo de consciência, você poderia testar o seguinte SQL?

select cm.codigo, cm.codigo_barras, cm.codigo_fabricante, cm.cod_fornecedor, cm.mercadoria, cf.fornecedor,


 Max(Case When(Gp.filial = 1) Then Gp.preco_g_vista End) As Preco_AS,

 Max(Case When(Gp.filial = 2) Then Gp.preco_g_vista End) As Preco_MT

 from cadastro_mercadorias cm

 inner join cadastro_fornecedor cf on (cf.codigo = cm.cod_fornecedor)

 Inner Join grade_produtos GP on (Gp.cod_produto = CM.codigo)

 Where exists (select count(*) from cadastro_mercadorias cc

 where cc.codigo_barras = cm.codigo_barras

 group by 1 having count(*) > 1)

 group by 1, 2, 3, 4, 5, 6

 order by  cm.codigo_barras

Em 2 de junho de 2011 10:00, Luciano franca <luapfirebird em yahoo.com.br> escreveu:

 Bom dia pessoal eu tenho uma consulta aqui que está demorando  2:01:00   já rodei a mesma consulta varias vezes e sempre a mesma media de tempo.




 Eu já executei em computadores diferentes para ver se tinha alguma problema relacionado a maquina mais sempre acontece a mesma coisa.

Rodei em maquinas como Windows 7 x64 x32  Windows Xp, todas elas eram Core 2 Duo 3 GHZ com 4 GB de Ram,  já fiz backup e Restore mudei a configuração de Page Size para todas a opções possiveis, revi todos os indices envolvidos e esta tudo certo.


Testei a ultima versão do Firebird 2x depois desistalei e coloquei o Firebird 2.5 testei tanto o Firebird x32 como x64



 Por ultimo instalei o PostGreSQL v.9  x32  nas mesmas maquinas que tenho o firebird criei a mesma estrutura do banco, com os mesmos PKs, FKs e indices coloquei todos os dados do Banco Firebird no PostGreSQL  e para minha surpresa o PostGreSQL demora em media apenas 00:19:00 para executar a mesma consulta com o mesmo numero de linhas.




  As Tabelas são

  cadastro_fornecedor      2022 Registros

  cadastro_mercadorias  41788 Registros

  grade_produtos            95020 Registros

 

A consulta SQL é



 select cm.codigo, cm.codigo_barras, cm.codigo_fabricante, cm.cod_fornecedor, cm.mercadoria, cf.fornecedor,

 Max(Case When(Gp.filial = 1) Then Gp.preco_g_vista End) As Preco_AS,

 Max(Case When(Gp.filial = 2) Then Gp.preco_g_vista End) As Preco_MT

 from cadastro_mercadorias cm

 inner join cadastro_fornecedor cf on (cf.codigo = cm.cod_fornecedor)

 Inner Join grade_produtos GP on (Gp.cod_produto = CM.codigo)

 Where exists (select cc.codigo_barras from cadastro_mercadorias cc

 where cc.codigo_barras = cm.codigo_barras

 group by 1 having count(cc.codigo_barras) > 1)

 group by 1, 2, 3, 4, 5, 6

 order by  cm.codigo_barras



 Acho o Firebird não consegue trabalhar muito bem com Sub-Select usando Exists.



 



______________________________________________

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






Mais detalhes sobre a lista de discussão lista