LENTIDAO DA STORE PROCEDURE - COMO MELHORO ?

SQL Server

19/12/2014

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

Curtidas 0

Respostas

Isaac Jose

Isaac Jose

19/12/2014

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
GOSTEI 0
Eduardo

Eduardo

19/12/2014

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

Valeu!
GOSTEI 0
Eduardo

Eduardo

19/12/2014

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
GOSTEI 0
Soeuseijothaz

Soeuseijothaz

19/12/2014

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.
GOSTEI 0
Isaac Jose

Isaac Jose

19/12/2014

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.
GOSTEI 0
POSTAR