我在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
答案 0 :(得分:0)
最初:用SELECT
子句中的子查询替换FROM
语句中的子查询。
以下是解决'减速'的一些选项:
1.如果不经常执行过程,请尝试使用RECOMPILE
选项。
2.看看统计数据。也许UPDATE STATISTICS
然后重新编译SP会更容易。
3.如果统计信息是问题,您可以尝试使用过滤的统计信息。
4.如果这些选项都不起作用,您可以从查询缓存中自动删除该过程的查询计划,并且每天都会重新编译过程。
但是,首先,重建主查询。