[firebase-br] Firebird x Processadores

Suporte Sinapse Informática suporte em sinapseinformatica.com.br
Qua Set 27 17:31:20 -03 2006


Prezado Marciano,

Eu já tive um problema de desempenho utilizando esse tipo de código SQL.

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'))

No código acima, pelo que eu entendi você tem um parâmetro CODFIL for igual 0 ele não deverá filtrá pelo campo ITENS_OP.CODFIL, mesma coisa é feita CODPRO, CODTAM e CODPAD. Se caso o usuário não quiser informar CODFIL, não sei porque a consulta fica um pouco lenta quando há muitos registros. A maneira que eu resolvi, ao invés esse tipo parâmetro na cláusula WHERE, utilize o SQL DINÂMICO, pois assim o código sql filtrará a tabela exatamente como o usuário quer ver. Faz um teste colocando esse código com sql dinâmico e veja se não ficará bom.

Espero ter ajudado,

CARLOS HENRIQUE MEIRELES
DESENVOLVIMENTO DE SISTEMAS
  ----- Original Message ----- 
  From: Marciano Bandeira 
  To: FireBase 
  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