CONSULTA LENTA

Firebird

04/02/2010

ola pessoal estou fazendo uma consulta comum monte de full joins

select d.DTEMISSAO,
case UPPER(d.operacao)
when ´PAGAR´ THEN COALESCE(F.nomefantasia,D.HISTORICO)
WHEN ´RECEBER´ THEN COALESCE(C.NOMEFANTASIA,D.HISTORICO)
ELSE D.HISTORICO END AS HISTORICO,
OPERACAO, tp.TIPOPAGTO, VALOR from DUPLICATA d
FULL join tipopagto tp on tp.codigo=d.tipopagto
FULL join pedido ped on ped.codigo=d.npedido
FULL join cliente c on c.codigo=ped.cliente
FULL join fornecedor f on f.codigo=ped.cliente
order by dtemissao

o objetivo émontar um extrato a partir da tabela duplicata, mas pra isso preciso chamar varias tabelas pelas chave estrangeiras.

porem essa consulta esta muuuito lenta, mesmo eu filtrando por data , colocando um dia que noa tem movimentacao ainda ta muito lenta, me falaram pra usar indices mas nao sei usar , principalmente considerando varias tabelas juntas, alguem pode me ajudar???


Rpdesign

Rpdesign

Curtidas 0

Respostas

Rpdesign

Rpdesign

04/02/2010

ps. o ibexpert retorna


------ Performance info ------
Prepare time = 0ms
[b:7a5743852c]Execute time = 28s 484ms[/b:7a5743852c]
Avg fetch time = 2.589,45 ms
Current memory = 1.077.656
Max memory = 1.275.512
Memory buffers = 2.048
Reads from disk to cache = 0
Writes from cache to disk = 0


GOSTEI 0
Carlos Mazzi

Carlos Mazzi

04/02/2010

ESSE eh o retorno direto do banco ou de sua aplicacao?
GOSTEI 0
Emerson Nascimento

Emerson Nascimento

04/02/2010

tente assim:

select
  d.DTEMISSAO,
  coalesce(C.NomeFantasia, F.NomeFantasia, D.Historico) AS HISTORICO,
  d.OPERACAO, tp.TIPOPAGTO, d.VALOR
from
  duplicata d
left join
  tipopagto tp on tp.codigo=d.tipopagto
left join
  pedido ped on ped.codigo=d.npedido
left join
  cliente c on upper(d.operacao)='RECEBER' and c.codigo=ped.cliente
left join
  fornecedor f on upper(d.operacao)='PAGAR' and f.codigo=ped.cliente
order by
  d.dtemissao


crie índices para todos os campos utilizados em relacionamentos, wheres e order by.


no caso:
tabela pedido : indice pelo campo codigo.
tabela cliente : indice pelo campo codigo.
tabela fornecedor : indice pelo campo codigo.
tabela tipopagto : indice pelo campo codigo.
tabela duplicata : indice pelo campo dtemissao.

GOSTEI 0
Rodolfo Patané

Rodolfo Patané

04/02/2010

  não  estou no escritorio mas vou testar assim que possivel e responder aqui, mas de cara ja achei interessante a remoção do case e a separação por operação no left join. desde ja agradeço
GOSTEI 0
POSTAR