简体   繁体   English

参数嗅探不起作用

[英]Parameter Sniffing Not working

I am using MSSQL. 我正在使用MSSQL。 I have a stored procedure which works fine for couple of days and later on it becomes slow. 我有一个存储过程,可以正常工作几天,然后变慢。 I came to know that Parameter Sniffing will work for it. 我知道参数嗅探将对此起作用。 How ever after implementing it it became slow for ever. 实施之后,它永远变得缓慢。 I also tried to Recompiling job. 我也尝试过重新编译作业。 I faced the same slowness issue immediately. 我立即遇到了同样的缓慢问题。

Can some one please help me with this ? 有人可以帮我吗?

Below is the structure of my 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

To make the query optimized for parameter sniffing, declare dummy variables and use them in your query, as opposed to using the original parameters as such. 为了使查询针对参数嗅探优化,请声明伪变量并在查询中使用它们,而不是像这样使用原始参数。

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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM