SQL 服务器存储过程优化

SQL Server Stored Procedure Optimization

我有以下存储过程 运行ning 针对 ExtractedMessages table 可能包含多达 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

您可以执行以下操作,而不是查询您的 table 两次:

DECLARE @ci INT
DECLARE @cr INT

DECLARE @T TABLE (
    ci INT
    , cr INT
    );

UPDATE ExtractedTasks
SET CurrentIndex = CurrentIndex + CurrentResources
OUTPUT DELETED.CurrentIndex, DELETED.CurrentResources
INTO @T (ci, cr)
WHERE Id = @taskId;

SELECT 
    @ci = ci, @cr = cr
FROM
    @T

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

这里的关键是OUTPUT子句。它会将已删除的记录(更新前的值)插入到 table 变量中。这意味着您将 table 中的多个 select 替换为一个。除了正确的索引之外,我看不到任何可以改进的地方。

此外,请确保您 select 只是您需要的列,而不是所有列。列出您需要的确切列通常是一个好习惯。

感谢大家的热心帮助 我能够确定问题所在,毕竟这是 运行 SQL 服务器上的内存管理问题。我增加了服务器的专用内存。问题已经解决。 SP现在运行顺利