【问题标题】:Stored procedure becomes slow every couple of days存储过程每隔几天就会变慢
【发布时间】:2016-08-02 12:56:14
【问题描述】:

我在 SQL Server 上遇到一个问题,我的存储过程在几天后变得很慢。

以下是我的存储过程的示例。

这可能是服务器端的缓存问题吗?我可以增加服务器的缓存大小来解决问题吗?

通常存储过程会在一秒钟内返回数据。

@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
'

【问题讨论】:

  • 调试性能可能是一个挑战。当它变慢时,它会保持缓慢还是只是针对特定查询运行缓慢? execution plan 可能从传入的参数中缓存了一个糟糕的计划。看看parameter sniffing 上的这个帖子——它可能会有所帮助:stackoverflow.com/questions/211355/…
  • @sgeddes 当它变慢时,它仅对特定输入变慢。对于某些输入,它的工作速度更快。
  • 尽量避免#temp,大结果意味着,执行慢,想办法解决它
  • 请发布更小输入和更快输入的执行计划
  • 虽然我通常会避免这种情况,因为它每次都会重新创建查询计划,但有时我别无选择。看看这个帖子:stackoverflow.com/questions/20864934/…

标签: sql sql-server database stored-procedures


【解决方案1】:

一些性能提示:

1) @UID 为 null 或 dbo.TABLE1.ID = @UID --> 这很糟糕,因为当 UID 为 null 和不为 null 时,您将有一个执行计划。构建一个动态 sql 查询,你会得到 2 个执行计划。

2) 更新维护计划中的统计数据。

3) 检查索引碎片。

4) 尝试在不使用临时表的情况下做同样的事情。

5) 尽量避免强制转换。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-09-05
    • 2016-01-29
    • 2010-11-26
    • 1970-01-01
    • 2013-04-13
    • 1970-01-01
    • 2017-12-10
    相关资源
    最近更新 更多