创建一个调度程序来重新编译存储过程

时间:2016-08-01 13:49:58

标签: sql sql-server stored-procedures

我在SQL Server上面临一个问题,我的存储过程在几天之后会变慢。

我开始知道重新编译存储过程会起作用。但是,我不想每次调用该存储过程时重新编译该存储过程。

在SQL Server上创建一个将执行以下语句的作业是一种好方法吗?

EXEC sp_recompile N'SP_NAME';

这会导致任何性能问题吗?

以下是我的SP结构。

@START_VALUE int=null,
@END_VALUE int=null`enter code here`
@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

1 个答案:

答案 0 :(得分:0)

最初:用SELECT子句中的子查询替换FROM语句中的子查询。

以下是解决'减速'的一些选项: 1.如果不经常执行过程,请尝试使用RECOMPILE选项。 2.看看统计数据。也许UPDATE STATISTICS然后重新编译SP会更容易。 3.如果统计信息是问题,您可以尝试使用过滤的统计信息。 4.如果这些选项都不起作用,您可以从查询缓存中自动删除该过程的查询计划,并且每天都会重新编译过程。

但是,首先,重建主查询。