Subject Slow view
Author Luciano Rodrigues
Hi,

I have the following view:

CREATE VIEW VIEWITEMLISTAPRECO(
CODIGO,
EMPRESA,
CODLISTA,
FLAGPRINCIPAL,
VALORCUSTOLIQUIDO,
VALORCUSTOBRUTO,
PRECOVENDA1,
PRECOVENDA2,
PRECOVENDA3,
PRECOVENDA4,
PRECOVENDA5,
PERCDESCONTO1,
PERCDESCONTO2,
PERCDESCONTO3,
PERCDESCONTO4,
PERCDESCONTO5,
ALIQIPI)
AS
Select Pro.Codigo,
Emp.EmpresaEstoque as Empresa,
rs_invl(Item.CodLista,0) as CodLista,
rs_invl(Item.flagprincipal,0) as FlagPrincipal,
rs_dnvl(Max(ValorCustoLiquido), 0) as ValorCustoLiquido,
rs_dnvl(Max(ValorCustoBruto), 0) as ValorCustoBruto,
Case
When (Max(Par.TipoPreco) = 0) And (Max(Item.MargemLucro1) > 0)
And (Max(Item.ValorCustoLiquido) > 0)
then rs_rounddec(Max(Item.ValorCustoLiquido) /
Max(Item.MargemLucro1),Max(Par.QtdCasasVenda))
When (Max(Par.TipoPreco) = 1) And (Max(Item.MargemLucro1) > 0)
And (Max(Item.ValorCustoLiquido) > 0)
then rs_rounddec(Max(Item.ValorCustoLiquido) *
Max(Item.MargemLucro1),Max(Par.QtdCasasVenda))
Else 0
End as MargemLucro1,
Case
When (Max(Par.TipoPreco) = 0) And (Max(Item.MargemLucro2) > 0)
And (Max(Item.ValorCustoLiquido) > 0)
then rs_rounddec(Max(Item.ValorCustoLiquido) /
Max(Item.MargemLucro2),Max(Par.QtdCasasVenda))
When (Max(Par.TipoPreco) = 1) And (Max(Item.MargemLucro2) > 0)
And (Max(Item.ValorCustoLiquido) > 0)
then rs_rounddec(Max(Item.ValorCustoLiquido) *
Max(Item.MargemLucro2),Max(Par.QtdCasasVenda))
Else 0
End as MargemLucro2,
Case
When (Max(Par.TipoPreco) = 0) And (Max(Item.MargemLucro3) > 0)
And (Max(Item.ValorCustoLiquido) > 0)
then rs_rounddec(Max(Item.ValorCustoLiquido) /
Max(Item.MargemLucro3),Max(Par.QtdCasasVenda))
When (Max(Par.TipoPreco) = 1) And (Max(Item.MargemLucro3) > 0)
And (Max(Item.ValorCustoLiquido) > 0)
then rs_rounddec(Max(Item.ValorCustoLiquido) *
Max(Item.MargemLucro3),Max(Par.QtdCasasVenda))
Else 0
End as MargemLucro3,
Case
When (Max(Par.TipoPreco) = 0) And (Max(Item.MargemLucro4) > 0)
And (Max(Item.ValorCustoLiquido) > 0)
then rs_rounddec(Max(Item.ValorCustoLiquido) /
Max(Item.MargemLucro4),Max(Par.QtdCasasVenda))
When (Max(Par.TipoPreco) = 1) And (Max(Item.MargemLucro4) > 0)
And (Max(Item.ValorCustoLiquido) > 0)
then rs_rounddec(Max(Item.ValorCustoLiquido) *
Max(Item.MargemLucro4),Max(Par.QtdCasasVenda))
Else 0
End as MargemLucro4,
Case
When (Max(Par.TipoPreco) = 0) And (Max(Item.MargemLucro5) > 0)
And (Max(Item.ValorCustoLiquido) > 0)
then rs_rounddec(Max(Item.ValorCustoLiquido) /
Max(Item.MargemLucro5),Max(Par.QtdCasasVenda))
When (Max(Par.TipoPreco) = 1) And (Max(Item.MargemLucro5) > 0)
And (Max(Item.ValorCustoLiquido) > 0)
then rs_rounddec(Max(Item.ValorCustoLiquido) *
Max(Item.MargemLucro5),Max(Par.QtdCasasVenda))
Else 0
End as MargemLucro5,
Item.aliqipi as ALIQIPI,
Item.PercDesconto1,
Item.PercDesconto2,
Item.PercDesconto3,
Item.PercDesconto4,
Item.PercDesconto5
From Produtos Pro
Left Join ItemListaPreco Item on Item.CodProduto = Pro.Codigo and
Item.FlagPrincipal = 1
, Empresas Emp
Left Join ParamControle Par on Par.Empresa = Emp.EmpresaEstoque
Group By Pro.Codigo, Emp.EmpresaEstoque, Item.CodLista,
Item.FlagPrincipal, Item.aliqipi,
Item.PercDesconto1, Item.PercDesconto2, Item.PercDesconto3,
Item.PercDesconto4,
Item.PercDesconto5
;

Adapted Plan
PLAN SORT (JOIN (JOIN (VP PRO NATURAL,VP ITEM INDEX
(ITEMLISTAPRECO1)),JOIN (VP EMP NATURAL,VP PAR INDEX (INTEG_1684))))

This view get 248.538 reads from EMPRESAS table and
165.692 reads from PARAMCONTROLE table, even I use any kind of result
set limitation like "where", "first 1".

I would like to know how this reads can be reduced.

Best regards.

--
Luciano Rodrigues Machado
Programador - Ribeirão Preto-SP