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

Eduardo Jedliczka edujed em gmail.com
Qui Jun 2 12:09:01 -03 2011


ops, faltou o GROUP BY do final.

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

PS: o group by já faz o order by internamente.

==========================
Eduardo Jedliczka
Apucarana - Pr
==========================




Em 2 de junho de 2011 12:07, Eduardo Jedliczka <edujed em gmail.com> escreveu:
> Na forma como o sql foi escrito, o bloco
>
> 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)
>
> será executado para TODOS os registros do join (juntamente com aquele
> SUM), para posterior "exclusão".
>
> é sabido pela equipe de desenvolvimento que existem otimizações
> possíveis para isto, mas a maioria delas ou apresenta problemas em
> alguns casos, ou são complexas demais para uma rápida implementação,
> pois podem interferir em outras características do banco. Quanto ao
> PostGre, seu otimizador é mais inteligente... ele conseguem modificar
> certas queries para "conseguir" um melhor desempenho.
>
> Sem querer dar lição de moral, mas isto é uma das pequenas diferenças
> entre DBAs e Analistas de Sistema. o DBA é OBRIGADO a conhecer
> profundamentes as características do banco de dados, e como se
> comporta cada tipo de SQL.
>
> Não tenho sua base modelada aqui, mas você poderia fazer um teste para
> nós (apenas a partir do FB 2.1)? Você poderia informar o PLAN
> utilizado em cada uma das consultas ?
>
> Select x.*, 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 (select cm.codigo_barras, cm.codigo, cm.codigo_fabricante,
> cm.cod_fornecedor, cm.mercadoria, count(cc.codigo_barras) as
> repeticoes
> from cadastro_mercadorias cm
> left outer join cc.codigo_barras on cc.codigo_barras = cm.codigo_barras
> group by 1,2,3,4,5
> having count(cc.codigo_barras) > 1) x
> left outer join cadastro_fornecedor cf on (cf.codigo = x.cod_fornecedor)
> left outer Join grade_produtos GP on (Gp.cod_produto = x.codigo)
>
> Abraço,
>
> ==========================
> Eduardo Jedliczka
> Apucarana - Pr
> ==========================
>
>
>
>
> Em 2 de junho de 2011 10:42, Luciano franca
> <luapfirebird em yahoo.com.br> escreveu:
>> Ele vai retornar produtos com o codigo de barras duplicados
>> eu sei que deve ter SQLs mais simples para esse proposito só que agora achei interessante o porque o PostGreSQL ser tão mais veloz
>>
>>
>> --- Em qui, 2/6/11, Marcelo Carvalho <marcelo.nc em gmail.com> escreveu:
>>
>> De: Marcelo Carvalho <marcelo.nc em gmail.com>
>> Assunto: Re: [firebase-br] Consulta demorando 2 horas como resolvo.
>> Para: "FireBase" <lista em firebase.com.br>
>> Data: Quinta-feira, 2 de Junho de 2011, 10:25
>>
>> Desculpe, mas fiquei um pouco perdido neste seu select e subselect's....
>> Me diga em poucas palavras o que vc precisa que retorne deste select ???
>>
>>
>> --
>> Atenciosamente,
>>
>> *Marcelo Carvalho*
>> MSN *carvalho826 em hotmail.com*
>> *
>> *
>> 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
>>>
>> ______________________________________________
>> 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
>> ______________________________________________
>> 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