[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