LENTIDAO DA STORE PROCEDURE - COMO MELHORO ?

19/12/2014

0

CREATE PROCEDURE TESTE
AS

DECLARE @SQL VARCHAR (MAX)

truncate table baixa_inss.conciliacao_data_temp


SET @SQL = ' INSERT INTO [baixa_inss].[conciliacao_data_temp]
([NOME],[CPF_CGC],[CONTRATO],[VAL_BEM],[VAL_PRT],[DT_EFETIVA],[PRODUTO],[STATUS],[PARC_ABERTAS],[DT_RCB]
,[NATUREZA_RCB],[D_NATUREZA_RCB],[COD_CONVENIADA],[MAXDENUM_PRC],[CONTARDENUM_PRC])

SELECT [NOME],[CPF_CGC],[CONTRATO],[VAL_BEM],[VAL_PRT],[DT_EFETIVA],[PRODUTO],[STATUS]
,[PARC_ABERTAS],[DT_RCB],[NATUREZA_RCB],[D_NATUREZA_RCB],[COD_CONVENIADA],[MAXDENUM_PRC],[CONTARDENUM_PRC]

FROM OPENQUERY (LNK_DWTOOLS,
''SELECT CLI.NOME,
CTO.CPF_CGC,
CTO.CONTRATO,
CTO.VAL_BEM,
CTO.VAL_PRT,
CTO.DT_EFETIVA,
CTO.PRODUTO,
CTO.STATUS,
CTO.NUM_PRC - CTO.NUM_PRC_PG AS PARC_ABERTAS,
PRT.DT_RCB,
PRT.NATUREZA_RCB,
NAT.D_NATUREZA_RCB,
SCC_EMP_CONV.COD_CONVENIADA,
MAX(CTO.NUM_PRC) AS MaxDeNUM_PRC,
COUNT(CTO.NUM_PRC) AS ContarDeNUM_PRC
-- C.NUM_PRC_PG
FROM (Select C.CPF_CGC,C.CONTRATO,C.VAL_BEM,C.VAL_PRT,C.DT_EFETIVA,C.PRODUTO,C.STATUS,C.NUM_PRC,C.NUM_PRC_PG,C.LOJA,C.EMP
FROM BMCTOOLS.CONTRATO C
WHERE
(C.DT_LIQ >= '''''+Convert(Varchar(10),@DT)+'''''
And C.DT_LIQ <= '''''+Convert(Varchar(10),@DT2)+'''''
)

AND EMP <> ''''54''''
) CTO
INNER JOIN BMCTOOLS.PARCELA PRT
ON PRT.CONTRATO = CTO.CONTRATO
INNER JOIN BMCTOOLS.SCC_LOJA_EMPRESA_CONVENIADA LOJA_EMP_CONV
ON LOJA_EMP_CONV.COD_LOJA = CTO.LOJA
INNER JOIN BMCTOOLS.SCC_EMPRESA_CONVENIADA SCC_EMP_CONV
ON SCC_EMP_CONV.COD_CONVENIADA = LOJA_EMP_CONV.COD_CONVENIADA
INNER JOIN BMCTOOLS.CLIENTE CLI
ON CTO.CPF_CGC = CLI.CPF_CGC
INNER JOIN BMCTOOLS.NATUREZA_RCB NAT
ON PRT.NATUREZA_RCB = NAT.NATUREZA_RCB
WHERE PRT.DT_RCB >= '''''+Convert(Varchar(10),@DT)+'''''
AND PRT.DT_RCB <= '''''+Convert(Varchar(10),@DT2)+'''''
AND PRT.NATUREZA_RCB <> 114 AND PRT.NATUREZA_RCB <> 115 AND PRT.NATUREZA_RCB <>165 AND PRT.NATUREZA_RCB <>154 AND PRT.NATUREZA_RCB <> 124 AND PRT.NATUREZA_RCB <> 153
AND PRT.NATUREZA_RCB <> 123 AND PRT.NATUREZA_RCB <> 116 AND PRT.NATUREZA_RCB <> 62 AND PRT.NATUREZA_RCB <> 156 AND PRT.NATUREZA_RCB <> 157 AND PRT.NATUREZA_RCB <> 147
AND PRT.NATUREZA_RCB <> 148 AND PRT.NATUREZA_RCB <> 162 AND PRT.NATUREZA_RCB <> 180 AND PRT.NATUREZA_RCB <> 169 AND PRT.NATUREZA_RCB <> 152 AND PRT.NATUREZA_RCB <> 137
AND SCC_EMP_CONV.COD_CONVENIADA = ''''4478''''
GROUP BY
CLI.NOME,
CTO.CPF_CGC,
CTO.CONTRATO,
CTO.VAL_BEM,
CTO.VAL_PRT,
CTO.DT_EFETIVA,
CTO.PRODUTO,
CTO.STATUS,
CTO.NUM_PRC - CTO.NUM_PRC_PG,
PRT.DT_RCB,
PRT.NATUREZA_RCB,
NAT.D_NATUREZA_RCB,
SCC_EMP_CONV.COD_CONVENIADA

'')'
EXEC (@SQL)

Update Data
Set ContratoExclusao = Case When (PRODUTO = 45 OR PRODUTO = 83 OR PRODUTO = 91 OR PRODUTO = 85) AND DT_EFETIVA <= '2008-07-31' Then '' Else CONTRATO END,
PRODUTO = Case When (PRODUTO = 45 OR PRODUTO = 83 OR PRODUTO = 91) THEN 85 ELSE PRODUTO END
From baixa_inss.conciliacao_data_temp Data
BEGIN TRY

IF OBJECT_ID('tempdb..#TMP') IS NOT NULL DROP TABLE #TMP
IF OBJECT_ID('tempdb..#Status') IS NOT NULL DROP TABLE #Status

SELECT CONTRATO 'contrato'
INTO #TMP
from baixa_inss.conciliacao_data_temp
where CONTRATO IS NOT NULL


Create Table #Status (NR_CONTRATO VARCHAR(9)
Collate SQL_Latin1_General_CP1_CS_AS,
DS_STATUS VARCHAR(30) Collate SQL_Latin1_General_CP1_CS_AS,
DT_ULTIMA_ANALISE DateTime
)


While (Select COUNT(*) from #TMP) > 0
Begin
Declare @ConjCto VARCHAR(MAX) =
(Select Top 500 '''''' + contrato + ''''',' From #TMP For Xml Path(''))


Set @ConjCto = LEFT(@ConjCto, Len(@ConjCto) - 1)


declare @vSQL VARCHAR(MAX)
set @vSQL = 'Delete From #TMP Where contrato In (' + REPLACE(@ConjCto ,'''''', '''') + ')'

exec (@vSQL)

Declare @Sql2 Varchar(Max) =
'Insert Into #Status Select NR_CONTRATO,DS_STATUS,DT_ULTIMA_ANALISE From Openquery(NETCERTOR,''Select NR_CONTRATO,DS_STATUS,DT_ULTIMA_ANALISE
From NTCUSER.PROPOSTA_CREDITO CRE INNER JOIN NTCUSER.NTC_CAD_STATUS_PROPOSTA ST
ON CRE.ST_PROPOSTA = ST.CD_STATUS
WHERE CRE.NR_CONTRATO IN ('+@ConjCto+') '')'
Exec (@Sql2)
End

Update Data
Set UltStatusNETCERTO = DS_STATUS,
DataExclusao = DT_ULTIMA_ANALISE
From baixa_inss.conciliacao_data_temp Data
Inner Join #Status St
On Data.CONTRATO = St.NR_CONTRATO

End Try

Begin Catch

End Catch

PRINT GETDATE()
PRINT 'UPDATE TIPOEXCLUSAO'

Update baixa_inss.conciliacao_data_temp
Set TipoExclusao = Case ISNULL(UltStatusNETCERTO,' ')
When 'Operação Finalizada' Then 'Intracred'
When ' ' Then 'Analise manual - Netcertor em replicação'
Else 'ESC' End
,
DataExclusao = Case UltStatusNETCERTO
When 'Excluída DataPrev' Then DataExclusao
Else NULL End


PRINT GETDATE()
PRINT 'SELECT FINAL'


select NOME,CPF_CGC,CONTRATO,VAL_BEM,VAL_PRT,DT_EFETIVA,PRODUTO,[STATUS],PARC_ABERTAS,DT_RCB,NATUREZA_RCB,
D_NATUREZA_RCB,COD_CONVENIADA,MAXDENUM_PRC,CONTARDENUM_PRC,ContratoExclusao,DataExclusao,UltStatusNETCERTO,
TipoExclusao from baixa_inss.conciliacao_data_temp
Eduardo

Eduardo

Responder

Posts

19/12/2014

Isaac Jose

Eduardo bom dia.
sua SP faz uma quantidade pe operações relativamente pequena nao era pra ter tanta lendidão entao vamos la.
o que vou te falar é o modo(cultura)que trabalho visando melhor performace.
90% dos casos que vejo de amigos sobre lentidão em instruções esta na construção das tabelas "obs nao sei se é o seu caso"
exemplo vc faz essa comparação Case When (PRODUTO = 45 OR PRODUTO = 83 OR PRODUTO = 91 OR PRODUTO = 85) AND DT_EFETIVA <= '2008-07-31' Then ''
eu usaria o in..... o campo seu dt_eferiva é um varchar... eu trabalho dividindo as datas para melhorar a busca... ex campos bintano , tintmes, tintdia só isso aumenta absurdamente a busca. se quiser e achar que é possivel melhorar a estrutura das suas tabelas poste que o auxilio no que for possivel.

abraços
Isaac
Responder

19/12/2014

Eduardo

Muito Obrigado pelas dicas, vou usa-las e ver se melhora

Valeu!
Responder

19/12/2014

Eduardo

o problema é que não posso alterar os campos das tabelas aqui do serviço...

Tem alguma forma de eu filtrar esses campos data de uma outra forma para ficar mais rápido ?

Obrigado
Responder

19/12/2014

Soeuseijothaz

Muito Obrigado pelas dicas, vou usa-las e ver se melhora

Valeu!


De onde vem os valores de @DT?

O porque do execute (EXEC)?

Já pensou em fazer em parte? Talvez criar um tabela temporária com o filtro de datas e depois ir refinando?

Não sei se vai ajudar, mas talvez lhe ajude.
Responder

19/12/2014

Isaac Jose

o problema é que não posso alterar os campos das tabelas aqui do serviço...

Tem alguma forma de eu filtrar esses campos data de uma outra forma para ficar mais rápido ?

Obrigado


se vc tiver como poder de criar as tabelas como o jothaz disse vc pode vazer em partes e criar suas tmp ou fisica mesmo. se tiver oportunidade de ter um banco so pra voce fazer esses testes vc pode criar suas tabelas apartir de algumas consultas e ai vc cria do jeito que quizer e ja com os filtros para relatorios quanto menor consumo de processamento melhor nao sei se é o seu caso.
Responder

Que tal ter acesso a um e-book gratuito que vai te ajudar muito nesse momento decisivo?

Ver ebook

Recomendado pra quem ainda não iniciou o estudos.

Eu quero
Ver ebook

Recomendado para quem está passando por dificuldades nessa etapa inicial

Eu quero

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar