[firebase-br] Ref. Velocidade no retorno da SP
Omar Haddad
omarhaddadm em gmail.com
Sex Jun 18 16:43:32 -03 2010
Salve amigos(as),
Criei esta SP para geração de dados para o Tribunal de Contas, mas só que
ela está demorando em média 25s para trazer-me o resultado.
O que poderia se feito para melhorar a performance da mesma ? chaves ?
especificar um plan de execução específico ?
Obrigado
Segue abaixo o código da SP
CODIGO STORED PROCEDURE
CREATE PROCEDURE SICOM_REG_OPS11 (
IGESTAO INTEGER,
IEXERCICIO INTEGER,
IMES INTEGER,
ILEGISLATIVO VARCHAR(1),
INROOP INTEGER,
INROEMPENHO INTEGER)
RETURNS (
TIPO_REGISTRO INTEGER,
CODPROGRAMA INTEGER,
CODORGAO INTEGER,
CODUNIDADE INTEGER,
CODFUNCAO INTEGER,
CODSUBFUNCAO INTEGER,
NATUREZAACAO VARCHAR(01),
NROPROJATIV VARCHAR(03),
ELEMENTODESPESA VARCHAR(06),
SUBELEMENTO VARCHAR(02),
DOTORIGP2001 VARCHAR(21),
NROEMPENHO INTEGER,
NROOP INTEGER,
BANCO INTEGER,
AGENCIA VARCHAR(07),
CONTACORRENTE VARCHAR(10),
NRDOCUMENTO VARCHAR(09),
TIPODOCUMENTO VARCHAR(02),
VLDOCUMENTO NUMERIC(18,2),
VLASSOCIADO NUMERIC(18,2),
DTEMISSAO DATE)
AS
DECLARE VARIABLE STIPO CHAR(1);
DECLARE VARIABLE NVALOR NUMERIC(12,2);
begin
FOR SELECT '11' as TipoRegistro,
Coalesce(E.PROGRAMA,0) as codPrograma,
o.CODIGO_ORGAO_TCMS as codOrgao,
Coalesce(u.CODIGO_UNIDADE_TCMS,0) as CodUnidade,
Coalesce(e.FUNCAO,0) as CodFuncao,
Coalesce(e.SUB_FUNCAO,0) as CodSubFuncao,
CASE WHEN e.PROJETO IS NOT NULL THEN substr(e.PROJETO,1,1) ELSE '0' END
as naturezaAcao,
CASE WHEN e.PROJETO IS NOT NULL THEN substr(e.PROJETO,2,4) ELSE '000'
END as nroProjAtiv,
CASE WHEN e.NATUREZA_DESPESA IS NOT NULL THEN
substr(e.NATUREZA_DESPESA,1,6) ELSE '000000' END as elementoDespesa,
'00' subElemento,
'000000000000000000000' as DotOrigP2001,
Coalesce(e.NUMERO,0) as NroEmpenho,
p.NUMERO as nroOp,
CASE WHEN P.CODIGO_BANCO STARTING '50101' THEN '999' ELSE A.CODIGO_BANCO
END AS BANCO,
CASE WHEN P.CODIGO_BANCO STARTING '50101' THEN '999999' ELSE
A.CODIGO_AGENCIA END AS AGENCIA,
CASE WHEN P.CODIGO_BANCO STARTING '50101' THEN '999999999999' ELSE
A.CONTA_BANCARIA END AS CONTACORRENTE,
CASE WHEN P.CODIGO_BANCO STARTING '50101' THEN '999999999' ELSE
P.NUMERO_DOCUMENTO END AS nrDocumento,
'99' As tipoDocumento,
Coalesce(pe.VALOR, p.VALOR_BRUTO) as vlDocumento,
CASE
/* CASO A NOTA TENHA MAIS DE UM EMPENHO */
WHEN Coalesce(pe.VALOR, p.VALOR_BRUTO) = P.VALOR_BRUTO THEN
P.VALOR_RETIDO
ELSE (P.VALOR_RETIDO * PE.VALOR) / P.VALOR_BRUTO
END AS vlAssociado,
Coalesce(E.DATA_EMISSAO, p.DATA_BAIXA) AS DtEmissao
FROM PAGAMENTO P
JOIN CREDOR C ON (C.CGC_CPF = P.CREDOR)
JOIN AGENCIA A ON (A.GESTAO = P.GESTAO)
AND (A.EXERCICIO = P.EXERCICIO_CONTABILIZACAO)
AND (A.CODIGO_PLANO = P.CODIGO_BANCO)
LEFT JOIN PAGAMENTOEMPENHO PE ON (PE.GESTAO = P.GESTAO)
AND (PE.EXERCICIO = P.EXERCICIO)
AND (PE.NUMERO = P.NUMERO)
LEFT JOIN EMPENHO E ON (E.GESTAO = PE.GESTAO)
AND (E.EXERCICIO = PE.EXERCICIO_EMPENHO)
AND (E.NUMERO = PE.NUMERO_EMPENHO)
join orgao_gestor o on (o.GESTAO = P.GESTAO)
LEFT JOIN UNIDADE u on (u.GESTAO_CONTROLE = e.GESTAO_CONTROLE)
and (u.EXERCICIO = e.EXERCICIO)
and (u.CODIGO = e.UNIDADE_ORCAMENTARIA)
LEFT JOIN RECURSO r on (r.GESTAO_CONTROLE = e.GESTAO_CONTROLE)
and (r.EXERCICIO = e.EXERCICIO)
and (r.FONTE_RECURSO = e.FONTE_RECURSO)
WHERE P.GESTAO = :IGESTAO
AND P.EXERCICIO_CONTABILIZACAO = :IEXERCICIO
AND P.NUMERO = :INROOP
AND PE.NUMERO_EMPENHO = :INROEMPENHO
AND EXTRACT(MONTH FROM P.DATA_BAIXA) = :IMES
and ((:ILegislativo = 'S') AND ((e.UNIDADE_ORCAMENTARIA = 101) OR
(e.UNIDADE_ORCAMENTARIA is null))
or ((:ILegislativo = 'N') AND ((e.UNIDADE_ORCAMENTARIA <> 101) OR
(e.UNIDADE_ORCAMENTARIA is null))))
ORDER BY P.GESTAO, P.EXERCICIO, P.NUMERO
INTO :TIPO_REGISTRO, :CODPROGRAMA, :CODORGAO, :CODUNIDADE, :CODFUNCAO,
:CODSUBFUNCAO, :NATUREZAACAO, :NROPROJATIV,
:ELEMENTODESPESA, :SUBELEMENTO, :DOTORIGP2001, :NROEMPENHO, :NROOP,
:BANCO, :AGENCIA,
:CONTACORRENTE, :NRDOCUMENTO, :TIPODOCUMENTO, :VLDOCUMENTO,
:VLASSOCIADO,
:DTEMISSAO do
begin
suspend;
end
---------
-- FOR SELECT Gestao, Nome from Orgao_Gestor INTO :TIPO_REGISTRO, :NOME do
-- begin
-- suspend;
-- end
end
--
Att.
Omar Marques Haddad
Analista de Sistemas Sênior
Mais detalhes sobre a lista de discussão lista