2016-08-23 2 views
0

Ich benutze MSSQL. Ich habe eine gespeicherte Prozedur, die für einige Tage funktioniert und später wird es langsam. Ich habe erfahren, dass Parameter Sniffing dafür geeignet ist. Wie auch immer, nach der Implementierung wurde es langsam für immer. Ich habe auch versucht, Job neu zu kompilieren. Ich war sofort mit der gleichen Langsamkeit konfrontiert.Parameter Sniffing funktioniert nicht

Kann jemand bitte mir dabei helfen?

Unten ist die Struktur meiner Stored Procedure.

@START_VALUE int=null, 
@END_VALUE int=null 
@UID NVARCHAR(MAX)=null, 
AS 
BEGIN 

SELECT 
dbo.TABLE1.ID, 
ROW_NUMBER() OVER (ORDER BY TABLE1.UPDATED_ON desc) AS RN, 
CONVERT(VARCHAR(10), dbo.TABLE1.DATE, 101) AS TDATE, 
CATEGORY = (
     SELECT TOP 1 COLUMN1 
     FROM TABLE5 CT1 
     WHERE TABLE1.CATEGORY = CT1.CATEGORY_ID 
    ), 
TYPETEXT = (
     SELECT TOP 1 COLUMN1 
     FROM TABLE6 CT1 
     WHERE TABLE1.TYPE = CT1.TYPE_ID 
    ), 
IMAGE = STUFF((SELECT DISTINCT ',' + CAST(pm.C1 AS varchar(12)) 
       FROM TABLE2 pm 
       WHERE pm.ID = TABLE1.ID AND pm.C1 IS NOT NULL AND pm.C1 <> '' 
       FOR XML PATH('')), 
       1, 1, '') INTO #tempRecords  
FROM dbo.TABLE1 
WHERE ((@UID is null OR dbo.TABLE1.ID = @UID) 
ORDER BY TABLE1.UPDATED DESC  

SELECT @count = COUNT(*) FROM #tempRecords; 

SELECT *, CONVERT([int],@count) AS 'TOTAL_RECORDS' 
FROM #tempRecords 
WHERE #tempRecords.RN BETWEEN CONVERT([bigint], @START_VALUE) AND  CONVERT([bigint], @END_VALUE)  

END 

GO 

Antwort

0

Um die Abfrage für das Parameter-Sniffing zu optimieren, deklarieren Sie Dummy-Variablen und verwenden Sie sie in Ihrer Abfrage, anstatt die ursprünglichen Parameter als solche zu verwenden.

CREATE PROCEDURE test_proc 
     @START_VALUE INT=NULL, 
     @END_VALUE INT=NULL, 
     @UID   NVARCHAR(max)=NULL 
    as 
     BEGIN 

     DECLARE @START_VALUE_SNIFF INT=NULL, 
     @END_VALUE_SNIFF INT=NULL, 
     @UID_SNIFF   NVARCHAR(max)=NULL 

     SET @START_VALUE_SNIFF = @START_VALUE 
     SET @END_VALUE_SNIFF = @END_VALUE 
     SET @UID_SNIFF = @UID 

     select * from 
     FROM dbo.TABLE1 
     WHERE ((@UID_SNIFF is null OR dbo.TABLE1.ID = @UID_SNIFF) 
     ORDER BY TABLE1.UPDATED DESC 

    END 
+0

Ich habe diesen Ansatz versucht. aber es verlangsamt sich sofort damit. – Hemal

Verwandte Themen