【发布时间】:2011-09-21 15:22:28
【问题描述】:
我正在尝试优化一个长事务,我已经看到以下操作已经完成了很多次:
Declare @myCursor CURSOR FAST_FORWARD FOR
SELECT field1, MIN(COALESCE(field2, -2)) FROM MyTable tempfact
LEFT JOIN MyTable sd
ON tempfact.ID = sd.ID AND sd.TransactionId = @transactionId
WHERE tempfact.SomeField IS NULL
AND tempfact.TransactionId = @transactionId
GROUP BY tempfact.field1
OPEN @myCursor
FETCH NEXT FROM @myCursor INTO @field1Variable, @field2Variable
WHILE @@FETCH_STATUS = 0
BEGIN
EXEC USP_SOME_PROC @field1Variable, @field2Variable
FETCH NEXT FROM @myCursor INTO @field1Variable, @field2Variable
END
CLOSE @myCursor
DEALLOCATE @myCursor
USP_SOME_PROC sproc 的代码如下:
IF NOT EXISTS (SELECT * FROM SomeTable WHERE Field1 = @field1)
BEGIN
INSERT INTO SomeTable (Field1, Field2)
VALUES (@field1, @field2)
END
就像我提到的,这是在很多地方完成的,涉及的表和字段不同,但想法保持不变,我相信如果没有游标,可能有一种方法可以提高这些存储过程的性能使用并且可能通过使这个事务更快,我们遇到的死锁问题(另一个帖子的主题)可能会得到解决。
【问题讨论】:
-
100 次中有 99 次,游标逻辑可以转换为基于集合的逻辑。
标签: sql-server sql-server-2008 database-cursor