[firebase-br] Firebird x Processadores

Eduardo Jedliczka (TeamFB) jedyfb em gmail.com
Qua Set 27 16:52:20 -03 2006


você disse que está usando uma SP... correto.

então não haveria problema  se você quebrasse isto em vários selects, 
totalizando parcialmente. pois o otimizador do banco achou que sua sequência 
de OR..AND..OR..AND... é complexa demais.

A solução (sem ter que quebrar muito a cabeça) é alterar dinamicamente o 
select para filtrar apenas os parâmetros informados, (não funciona no FB 
1.0.X) assim o banco usará os índices.

apenas para simplificar um pouco, troque a sequencia de flag igual or flag 
igual, para pedidos.Flag in ('P', 'T', 'A')

Quanto ao último select, o banco percebeu a vantagem de usar índice quando 
você colocou aquela condição do CODDEP_DEF

======================
Eduardo Jedliczka
Membro do TeamFB - FireBase
Apucarana - PR
======================
"Posso não concordar com nada do que dizes.
Mas defenderei até a morte o seu direito de dizê-lo"
(Voltaire 1694-1778)

----- Original Message ----- 
From: "Marciano Bandeira" <marciano.bandeira em bol.com.br>
To: "FireBase" <lista em firebase.com.br>
Sent: Wednesday, September 27, 2006 1:55 PM
Subject: Re: [firebase-br] Firebird x Processadores


Procedimento que retorna a quantidade de produtos em aberto na produção
Minha procedure executa esta select...

  Select
    Sum(Itens_Op.QTSET)
  From
    Itens_OP
  Where
    ((:CODFIL = 0) or (:CODFIL = Itens_Op.CODFIL)) and
    ((:CODPRO = 0) or (:CODPRO = Itens_OP.CODPRO)) and
    ((:CODTAM = 0) or (:CODTAM = Itens_OP.CODTAM)) and
    ((:CODPAD = 0) or (:CODPAD = Itens_Op.CODPAD)) and
    ((Itens_Op.FLAG = 'A'))

... e o PLAN gerado é NATURAL, estranho, pois a tabela Itens_OP tem índices
para as colunas CODFIL, CODPRO, CODTAM e CODPAD (um indice por coluna).


Procedimento que me retorna a quantidade que tenho de pedidos de um produto
Minha procedure executa esta select...

  Select
    Sum(Itens_Ped.QTPRO - (Itens_Ped.QTCAN + Itens_Ped.QTFAT))
  From
    Itens_Ped
  Left Join Pedidos On (Itens_Ped.IDPED = Pedidos.IDPED)
  Where
    ((Pedidos.FLAG = 'P') or (Pedidos.FLAG = 'T') or (Pedidos.FLAG = 'A'))
and
    ((Pedidos.TIPO = 1)   or (Pedidos.TIPO = 3))
and
    ((:CODFIL         = 0)   or (:CODFIL         = Pedidos.CODFIL))
and
    ((:CODPRO         = 0)   or (:CODPRO         = Itens_Ped.CODPRO))
and
    ((:CODPAD         = 0)   or (:CODPAD         = Itens_Ped.CODPAD))
and
    ((:CODTAM         = 0)   or (:CODTAM         = Itens_Ped.CODTAM))
and
    ((:CODGRD         = 0)   or (:CODGRD         = Itens_Ped.CODGRD))

e o plan gerado é este...
PLAN JOIN (ITENS_PED NATURAL,PEDIDOS INDEX (PEDIDOS_IDPED))

... segue o mesmo caso da rotina que retorna a qtde aberto na produção,
tenho indices para as colunas CODFIL, CODPRO, CODPAD, CODTAM, CODGRD na
tabela Itens_Ped (um indice para cada coluna).



Ja a rotina que me retorna o estoque tem um comportamento diferente,
o select realizado é este...

  Select
    Sum(prodest.estfis)
  From
    prodest
  Where
    (
        ((:CODDEP  = 0) and (ProdEst.coddep <> :CODDEP_DEF)) or
        ((:CODDEP <> 0) and (ProdEst.coddep =  :CODDEP))
    )                                             and
    ((:codfil = 0) or (prodest.codfil = :codfil)) and
    (:CODPRO = prodest.codpro)                    and
    ((:CODTAM = 0) or (:CODTAM = prodest.codtam)) and
    ((:CODPAD = 0) or (:CODPAD = prodest.codpad))

... o PLAN gerado é este...
PLAN (PRODEST INDEX (PRODEST_CODPRO))

... Tenho indices para as colunas CODPRO, CODPAD, CODTAM, CODFIL, CODDEP (um
indice para cada coluna).



O que poderia resolver isto, porque a rotina do estoque usa um PLAN com
indice e as outroas não?
É aconcelhavel criar indices separados por coluna ou indices com varias
colunas juntas?
Como fasso pra colocar um PLAN definido por min na consulta?

Grato
Marciano Bandeira


______________________________________________
FireBase-BR (www.firebase.com.br) - Hospedado em www.locador.com.br
Para editar sua configuração na lista, use o endereço 
http://mail.firebase.com.br/mailman/listinfo/lista_firebase.com.br
Para consultar mensagens antigas: http://firebase.com.br/pesquisa 





Mais detalhes sobre a lista de discussão lista