2016-08-23 83 views
0

我正在使用MSSQL。我有一个存储过程,它可以在几天内正常工作,之后会变得很慢。我开始知道参数嗅探会适用于它。实施它后永远变得缓慢。我也尝试重新编译工作。我立即面对同样的缓慢问题。参数嗅探不工作

有人可以帮助我吗?

下面是我的存储过程的结构。

@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 

回答

0

为了使参数嗅探优化查询,声明虚拟变量并在查询中使用它们,而不是像原来那样使用原始参数。

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

我试过这种方法。但是随着这一点立即放缓。 – Hemal