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现在运行顺利
我有以下存储过程 运行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现在运行顺利