[firebase-br] Firebird x Processadores

Marciano Bandeira marciano.bandeira em bol.com.br
Qua Set 27 13:55:11 -03 2006


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





Mais detalhes sobre a lista de discussão lista