[firebase-br] Relatorio de View lenta... alguma alternativa?

Carlos H. Cantu listas em warmboot.com.br
Seg Nov 26 14:00:05 -03 2018


Usando Union All, o tempo não deve ser maior do que a soma dos tempos
de execução dos selects individualmente.

Sugiro que vc use JOINs ao invés de listar todas as tabelas no
"from"... pode ser que o otimizador esteja "se confundindo" ao definir
o PLAN para a view.

[]s
Carlos H. Cantu
eBook Guia de Migração para o FB 3 - www.firebase.com.br/guiafb3.php
www.FireBase.com.br - www.firebirdnews.org - blog.firebase.com.br

SL> bom dia,

SL> Tenho uma view q agrupa dados de alguns tabelas:

SL> Inicialmente funcionava tranquilo mais agora depois da base ficar um pouco
SL> maior percebi lentidão quando visualizo esta view (até 40 segundos). Já foi
SL> verificado algumas coisas como:
SL> 1 - os campos q estão dispostos nas where já possuem indices, exceto os de
SL> datas;
SL> 2 - verifico que quando rodo os selects individualmente nenhum deles
SL> apresenta qualquer lentidão (1 segundo para executar);

SL> já li em alguns lugares que o comando union deixa lento mesmo, existe
SL> alguma forma de melhorar esse script ou utilizar de outro método mais
SL> eficaz q me retorne o mesmo resultado?

SL> CREATE VIEW LISTA_PRODUTOS_VENDA(
SL>     PCODIGO, DESCRICAO, UN,MARCA, DATA, QUANTIDADE, SALDO, TOTAL, GRUPO,
SL>     LK_CLIENTE, CMV, LK_VENDEDOR, TIPO)  AS
SL> select pcodigo, descricao, un, marca_produto, data, qde, saldo_calculado,
SL> v_total, grupo,
SL> lk_cliente, coalesce( (cast( cmv as double precision) * cast( qde as double
SL> precision) ),0) as cmv, lk_vendedor,

SL> case when venda.status in (12,13) then 'CANCELADO'
SL>      when venda.tipo_venda = 4 then 'BONIFICACAO'
SL>      when venda.tipo_venda = 2 then 'AVISTA'
SL>      when venda.status not in (16,18) then 'FATURADO' end as tipo

SL> from venda, vendaitem, lista_produtos_geral
SL> where lk_venda = vcodigo and lk_produto = pcodigo and data >=
SL> current_date-(365*2)

SL> union all

SL> select lancITENS.ITEM, descricao, un, marca_produto, data, qde,
SL> saldo_calculado, t_valor, grupo,
SL> 0 as lk_cliente, coalesce( (cast( cmv as double precision) * cast( qde as
SL> double precision) ),0) as cmv, lk_vendedor,  'BALCAO' as tipo
SL> from movto, lanc, lancitens, lista_produtos_geral
SL> where lk_lancamento = lanc.codigo and lk_movimento = movto.codigo and item
SL> = pcodigo
and data >>= current_date-(365*2) and lanc.conta <> 99

SL> union all

SL> select lancITENS.ITEM, descricao, un, marca_produto, data, qde,
SL> saldo_calculado, t_valor, grupo,
SL> 0 as lk_cliente, coalesce( (cast( cmv as double precision) * cast( qde as
SL> double precision) ),0) as cmv, lk_vendedor,  'CANCELADO' as tipo
SL> from movto, lanc, lancitens, lista_produtos_geral
SL> where lk_lancamento = lanc.codigo and lk_movimento = movto.codigo and item
SL> = pcodigo
and data >>= current_date-(365*2) and lanc.conta = 99

SL> union all

SL> select pcodigo, descricao, un, marca_produto, data, qde, saldo_calculado,
SL> t_valor, grupo,
SL> lk_cliente, coalesce( (cast( cmv as double precision) * cast( qde as double
SL> precision) ),0) as cmv, lk_vendedor,

SL> case when orc.status = 55 then 'CANCELADO'
SL>      when coalesce((select r.status from orcremessa r where r.codigo =
SL> orc.lk_remessa),0) in (3,4) then  case when orc.status = 11 then
SL> 'BONIFICACAO' else 'EM ROTA' end
SL>      else
SL>         case when orc.status = 11 then 'ROMANEIO BONIF'
SL>         when orc.status not in (10) THEN 'ROMANEIO' ELSE 'OUTROS' end

SL> end as tipo

SL> from orc, orcitem, lista_produtos_geral
SL> where lk_orcamento = orc.codigo and item = pcodigo and data >=
SL> current_date-(365*2)





Mais detalhes sobre a lista de discussão lista