Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Marlon C.

Tunning de SQL

Recommended Posts

Galera,

 

Gostaria de uma ajuda a melhorar a criação desta stored, uso ela como função de select , bem simples mas faz alguns calculos dentro da propria query, gostaria de saber de alguns usuarios DBA um pouco mais velhos qua a melhro forma de monta-la... ou calculo com variaveis dentro da stred ou dentro da propria query de pesquisa !

 

Segue a tripa monstro :

 

DECLARE @SQL NVARCHAR(4000)

DECLARE @TIPO NVARCHAR(2)

DECLARE @PAR_04 VARCHAR(100)

 

IF (@PAR_03 = 'TBANALISE')

SET @PAR_04 = 'and (prov=2)'

ELSE

SET @PAR_04 = ''

 

IF (@PAR_03 = 'TBACAO')

SET @PAR_04 = ''

ELSE

SET @PAR_04 = ''

 

SET @TIPO = CAST(@TYPE AS NVARCHAR(2))

SET @SQL =

'

SELECT

DATENAME(YY, TBPASSO1.CREATEIN + '+@TARGET+') ,

MONTH(TBPASSO1.CREATEIN+'+@TARGET+') AS MES,

DATENAME('+@PAR_01+', TBPASSO1.CREATEIN + '+@TARGET+')+'' ''+

DATENAME(YY, TBPASSO1.CREATEIN+ '+@TARGET+') AS DATA,

COUNT(

CASE

WHEN

DATEDIFF(DAY,TBPASSO1.CREATEIN,TAB.CREATEIN) <= '+@TARGET+' THEN 1

ELSE NULL

END) AS PSP_OK,

COUNT(

CASE

WHEN

( TAB.FK_PASSO IS NULL OR DATEDIFF(DAY,TBPASSO1.CREATEIN,TAB.CREATEIN) > '+@TARGET+') and (

DATEDIFF(DAY,TBPASSO1.CREATEIN,Getdate()) <= '+@TARGET+' ) THEN 1

ELSE NULL

END) AS PSP_PENDENTES,

(COUNT(*) - (

COUNT(

CASE

WHEN

DATEDIFF(DAY,TBPASSO1.CREATEIN,TAB.CREATEIN) <= '+@TARGET+' THEN 1

ELSE NULL

END) + COUNT(

CASE

WHEN

( TAB.FK_PASSO IS NULL OR DATEDIFF(DAY,TBPASSO1.CREATEIN,TAB.CREATEIN) > '+@TARGET+') and (

DATEDIFF(DAY,TBPASSO1.CREATEIN,Getdate()) <= '+@TARGET+' ) THEN 1

ELSE NULL

END)

)) AS PSP_NOK,

CAST

((

(

( CAST(COUNT(CASE

WHEN

DATEDIFF(DAY,TBPASSO1.CREATEIN,TAB.CREATEIN) <= '+@TARGET+' THEN 1

ELSE NULL

END) AS FLOAT)

+ CAST(COUNT(CASE

WHEN

( TAB.FK_PASSO IS NULL OR DATEDIFF(DAY,TBPASSO1.CREATEIN,TAB.CREATEIN) > '+@TARGET+') and (

DATEDIFF(DAY,TBPASSO1.CREATEIN,Getdate()) <= '+@TARGET+' ) THEN 1

ELSE NULL

END) AS FLOAT)

)

/ CAST(COUNT(*) AS FLOAT)

) * 100

)

AS NUMERIC(4,1)

) AS PSP_PERCENT,

COUNT(*) AS PSP_EMITIDOS

 

FROM

TBPASSO1

JOIN TBAREA AREA ON (tbpasso1.RESP3 = AREA.ID)

JOIN TBAREA SHOP ON (AREA.owner = SHOP.ID)

JOIN TBUSER USUARIO ON (tbpasso1.RESP4 = USUARIO.ID)

LEFT OUTER JOIN '+@PAR_03+' TAB ON (TBPASSO1.ID = TAB.FK_PASSO) '+@PAR_04+'

 

WHERE

(TBPASSO1.PSPTYPE ='+@TIPO+')

'+ /* SELECIONA OS PSP'S SOMENTE VÁLIDOS, ELIMINA PSP'S CANCELADOS */

' and (tbpasso1.situacao < 11 )

'+ /* SELECIONA OS PSP'S SOMENTE VÁLIDOS, ELIMINA PSP'S CANCELADOS */

' and (TBPASSO1.CREATEIN BETWEEN '''+@DATA_01+''' AND '''+@DATA_02+''')

'+@PAR_02+'

 

GROUP BY

DATENAME(YY, TBPASSO1.CREATEIN+'+@TARGET+') ,

DATENAME('+@PAR_01+', TBPASSO1.CREATEIN+'+@TARGET+')+'' ''+

DATENAME(YY, TBPASSO1.CREATEIN+'+@TARGET+') ,

MONTH(TBPASSO1.CREATEIN+'+@TARGET+')

 

ORDER BY

DATENAME(YY, TBPASSO1.CREATEIN+'+@TARGET+') ,

MONTH(TBPASSO1.CREATEIN+'+@TARGET+'),

DATENAME('+@PAR_01+', TBPASSO1.CREATEIN+'+@TARGET+')+'' ''+

DATENAME(YY, TBPASSO1.CREATEIN+'+@TARGET+')

'/*

INTO '+@TEXTO+','+@TEXTO+','+@TEXTO+','+@TEXTO+','+@PSP_OK+','+@VALOR+','+@VALOR++','+@VALOR+','+@VALOR

*/

 

EXEC (@SQL)

Compartilhar este post


Link para o post
Compartilhar em outros sites

Marlon C. beleza?!

 

Qtos registros sao afetados nesta sua sp?

kal a versao do SQL?

kal o tempo de resposta da proc?

há pico de processamento qdo executada?

ufa.... tah kase

Muitas vezes a proc eh gigante, mas o server eh robusto (muita memoria, processador) e nao percebemos picos de lentidao no sistema

Os indices e o "fill factor" esta configurados como?

 

você conhece "execution plan" ou "client statistcs" ? São ferramentas do SQL 2005 que ajudam a verificar performance ;)

 

Abçs

Compartilhar este post


Link para o post
Compartilhar em outros sites

Opa Junior,

 

SQL Server 2005.

 

Cerca de 10 a 5000 registros de acordo com a pesquisa, o tempo leva entre 0,5 a 1,7 seg.

Não há picos, a performance dela esta muito boa, procuro mais uma otimização nesta sql. pois acho que está muito grosseiro o modo de obtenção dos dados ! http://forum.imasters.com.br/public/style_emoticons/default/joia.gif

 

Thanks,

MC

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.