[firebase-br] Otimizar SP
Vânia
vania em informaticaomni.com.br
Ter Jul 25 13:49:01 -03 2006
Olá Francisco,
obrigada pela ajuda mas ainda não estou conseguindo:
a stored procedure q calcula a área é assim:
CREATE PROCEDURE SOMAVARAREACLIENTE (
VARIEDADE VARCHAR(15),
DATAINI INTEGER,
DATAFIM INTEGER)
RETURNS (
CODCLIENTE VARCHAR(6),
SOMAVARAREA DOUBLE PRECISION)
AS
begin
for select CodUsina, sum(Area)
from DadVar where Mes between :DataIni and :datafim
and CodVariedade = :Variedade and Area is not null
group by CodCliente
into :CodCliente, :SomaVarArea
do
suspend;
end
as colunas var1...var12 correspondem ao código da variedade, esses códigos
são cadastrados pelo usuário e ele seleciona quais ele deseja visualizar no
relatório (no máximo 12). A segunda stored procedure era assim
CREATE PROCEDURE RETORNAVARAREACLIENTE (
VAR1 VARCHAR(15),
VAR2 VARCHAR(15),
VAR3 VARCHAR(15),
VAR4 VARCHAR(15),
VAR5 VARCHAR(15),
VAR6 VARCHAR(15),
VAR7 VARCHAR(15),
VAR8 VARCHAR(15),
VAR9 VARCHAR(15),
VAR10 VARCHAR(15),
VAR11 VARCHAR(15),
VAR12 VARCHAR(15),
DATAINI INTEGER,
DATAFIM INTEGER)
RETURNS (
CODCLIENTE VARCHAR(6),
VARAREA1 DOUBLE PRECISION,
VARAREA2 DOUBLE PRECISION,
VARAREA3 DOUBLE PRECISION,
VARAREA4 DOUBLE PRECISION,
VARAREA5 DOUBLE PRECISION,
VARAREA6 DOUBLE PRECISION,
VARAREA7 DOUBLE PRECISION,
VARAREA8 DOUBLE PRECISION,
VARAREA9 DOUBLE PRECISION,
VARAREA10 DOUBLE PRECISION,
VARAREA11 DOUBLE PRECISION,
VARAREA12 DOUBLE PRECISION
)
AS
begin
for select V1.CodCliente, case when :Var1 <> '' then V1.SomaVarArea else 0
end as Var1,
case when :Var2 <> '' then V2.SomaVarArea else 0 end as Var2,
case when :Var3 <> '' then V3.SomaVarArea else 0 end as Var3,
case when :Var4 <> '' then V4.SomaVarArea else 0 end as Var4,
case when :Var5 <> '' then V5.SomaVarArea else 0 end as Var5,
case when :Var6 <> '' then V6.SomaVarArea else 0 end as Var6,
case when :Var7 <> '' then V7.SomaVarArea else 0 end as Var7,
case when :Var8 <> '' then V8.SomaVarArea else 0 end as Var8,
case when :Var9 <> '' then V9.SomaVarArea else 0 end as Var9,
case when :Var10 <> '' then V10.SomaVarArea else 0 end as Var10,
case when :Var11 <> '' then V11.SomaVarArea else 0 end as Var11,
case when :Var12 <> '' then V12.SomaVarArea else 0 end as Var12
from (((((((((((SomaVarAreaCliente(:Var1, :DataIni, :DataFim) V1 left join
SomaVarAreaCliente(:Var2, :DataIni, :DataFim) V2 on V2.CodCliente =
V1.CodCliente) left join
SomaVarAreaCliente(:Var3, :DataIni, :DataFim) V3 on V3.CodCliente =
V1.CodCliente) left join
SomaVarAreaCliente(:Var4, :DataIni, :DataFim) V4 on V4.CodCliente =
V1.CodCliente) left join
SomaVarAreaCliente(:Var5, :DataIni, :DataFim) V5 on V5.CodCliente =
V1.CodCliente) left join
SomaVarAreaCliente(:Var6, :DataIni, :DataFim) V6 on V6.CodCliente =
V1.CodCliente) left join
SomaVarAreaCliente(:Var7, :DataIni, :DataFim) V7 on V7.CodCliente =
V1.CodCliente) left join
SomaVarAreaCliente(:Var8, :DataIni, :DataFim) V8 on V8.CodCliente =
V1.CodCliente) left join
SomaVarAreaCliente(:Var9, :DataIni, :DataFim) V9 on V9.CodCliente =
V1.CodCliente) left join
SomaVarAreaCliente(:Var10, :DataIni, :DataFim) V10 on V10.CodCliente
= V1.CodCliente) left join
SomaVarAreaCliente(:Var11, :DataIni, :DataFim) V11 on V11.CodCliente
= V1.CodCliente) left join
SomaVarAreaCliente(:Var12, :DataIni, :DataFim) V12 on V12.CodCliente
= V1.CodCliente)
into :CodCliente, :VarArea1, :VarArea2, :VarArea3, :VarArea4, :VarArea5,
:VarArea6, :VarArea7,
:VarArea8, :VarArea9, :VarArea10, :VarArea11, :VarArea12
do
suspend;
end
Eu fiz o select do jeito q vc falou dessa forma:
select
CodCliente,
sum(case when Codvariedade = :Var1 then area else 0 end) v1,
sum(case when Codvariedade = :Var2 then area else 0 end) v2,
sum(case when Codvariedade = :Var3 then area else 0 end) v3,
sum(case when Codvariedade = :var4 then area else 0 end) v4,
sum(case when Codvariedade = :var5 then area else 0 end) v5,
sum(case when Codvariedade = :var6 then area else 0 end) v6,
sum(case when Codvariedade = :var7 then area else 0 end) v7,
sum(case when Codvariedade = :var8 then area else 0 end) v8,
sum(case when Codvariedade = :var9 then area else 0 end) v9,
sum(case when Codvariedade = :var10 then area else 0 end) v10,
sum(case when Codvariedade = :var11 then area else 0 end) v11,
sum(case when Codvariedade = :var12 then area else 0 end) v12,
from
Dadvar
where
mes between 4 and 12
group by
CodCliente
mas parece q ele só considera o primeiro parametro, pois retorna somente a
soma da área do primeiro parâmetro q foi passado e todas as colunas ficam
com o mesmo valor
"francisco gamarra"
<francisco.gamarra em gmail.com> escreveu na
mensagem news:2cdd3ed60607250612q56d4e57cgbf0ca722bdf9ed93 em mail.gmail.com...
select
cliente,
sum(case when variedade = 1 then area else 0) end v1,
sum(case when variedade = 2 then area else 0) end v2,
sum(case when variedade = 3 then area else 0) end v3,
sum(case when variedade = 4 then area else 0) end v4,
sum(case when variedade = 5 then area else 0) end v5,
sum(case when variedade = 6 then area else 0) end v6,
sum(case when variedade = 7 then area else 0) end v7,
sum(case when variedade = 8 then area else 0) end v8,
sum(case when variedade = 9 then area else 0) end v9,
sum(case when variedade = 10 then area else 0) end v10,
sum(case when variedade = 11 then area else 0) end v11,
sum(case when variedade = 12 then area else 0) end v12
from
tabela
where
mes between 1 and 7
group by
cliente
2006/7/25, francisco gamarra
<francisco.gamarra em gmail.com>:
>
> vc pd me mandar a estrutura de suas sp's?
> eu vi q vc colocou var1..var12. Cada coluna corresponde a um mês ou o
> codvariedade?
>
> Em 25/07/06, Vânia
> <vania em informaticaomni.com.br> escreveu:
> >
> > Olá pessoal,
>
> estou com o seguinte problema: possuo uma tabela com a seguinte estrutura:
> CodCliente, CodVariedadade, Mes, Area.
>
> Possuo um relatório que faz a soma da área e que deverá ficar da seguinte
> forma:
>
> Cliente Var1 Var2...Var12 Total
> 1 12 4 21 50
> 2 15 6 18 60
>
> Nesse relatório o usuário escolhe quais as variedades ele deseja
> visualizar
> e qual a faixa de meses que serão considerados (por ex. de janeiro a
> julho)
>
> Para isso eu criei uma stored procedure que calcula a soma de area dentro
> do
> periodo desejado para uma determinada variedade, passando por parâmetro o
> mes inicial, o mes final e a variedade.
>
> Depois criei uma segunda stored procedure que chama q primeira para cada
> variedade q o usuário escolheu fazendo left join.Por ex.
>
> Select V1.Area, V2, Area....V10.Area
> from SP(1,7,3) V1 left join
> SP(1,7,4) V2 on V1.CodCliente = V2.CodCliente left join SP(1,7,5) V3
> on....
>
> o problema é q a segunda SP demora horrores pra abrir (tipo uns 20 min),
> acredito q seja por causa dos left join...
>
> alguém saberia me dizer como posso fazer isso de outra maneira??? se eu
> devo
> mudar a modelagem do banco, se tem como, na segunda SP, chamar a primeira
> várias vezes passando parâmetros diferentes sem usar left/inner
> join...etc..
>
> já pesquisei na net e aqui na lista e não consegui encontrar nada
> parecido....
>
> Desde já agradeço
> Vânia
>
>
>
>
>
>
> ______________________________________________
> 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
>
>
>
>
______________________________________________
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