[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