[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