SQL Server存储过程优化

时间:2017-07-09 07:17:15

标签: sql-server database-performance

我对ExtractedMessages表运行以下存储过程,该表最多可包含100M条记录(100,000,000)。

出于我的应用目的,此存储过程应在不到一秒的时间内运行

CREATE PROCEDURE GetNextMessages 
    @taskId bigint
AS
BEGIN
    SET NOCOUNT ON;

    DECLARE @ci INT
    DECLARE @cr INT

    SELECT 
        @ci = CurrentIndex, @cr = CurrentResources 
    FROM
        ExtractedTasks 
    WHERE
        Id = @taskId

    UPDATE ExtractedTasks 
    SET CurrentIndex = @ci + @cr 
    WHERE Id = @taskId

    SELECT * 
    FROM ExtractedMessages 
    WHERE TaskId = @taskId
    ORDER BY Id 
        OFFSET @ci ROWS
        FETCH NEXT @cr ROWS ONLY
END

注意:cr不能超过1500

2 个答案:

答案 0 :(得分:0)

您可以执行以下操作,而不是两次查询您的表: DECLARE @ci INT DECLARE @cr INT DECLARE @T TABLE(     ci INT     ,cr INT     ); 更新ExtractedTasks SET CurrentIndex = CurrentIndex + CurrentResources OUTPUT DELETED.CurrentIndex,DELETED.CurrentResources INTO @T(ci,cr) WHERE Id = @taskId; 选择     @ci = ci,@ cr = cr 从     @T 选择 * 来自ExtractedMessages WHERE TaskId = @taskId 订购ID     OFFSET @ci ROWS     FETCH NEXT @cr ROWS ONLY 这里的关键是OUTPUT子句。它将删除的记录(更新前的值)插入表变量中。这意味着您可以用一个表替换多个选择。除了正确的索引,我没有看到任何改进。 此外,请确保只选择所需的列,而不是所有列。列出您需要的精确列通常是一种很好的做法。

答案 1 :(得分:0)

感谢大家的帮助 我能够识别问题,毕竟它是运行SQL Server的服务器上的内存管理问题。我增加了服务器的专用内存。问题已经解决了。 SP现在顺利运作