使用光标将查询转换为更优化的方法

时间:2019-04-01 18:47:21

标签: sql-server-2008-r2

我有一个包含许多列的表,但是在这种情况下有两个是我们感兴趣的。列中的一列表示颠覆提交编号,另一列表示何时使用上述提交编号中的数据运行自动化过程的时间戳。有许多行具有相同的提交编号,并且任何编号大于或等于时间戳的1。我需要获取不同提交编号的列表,以及每个表中最早的时间戳。

我可以使用游标在不同的提交编号之间进行迭代,并为每个提交找到前1个时间戳,但这很慢,因为表中有5600万行。我确信必须有一种更有效的方法。

下面您可以看到我的TSql。

DECLARE @CommitDates TABLE (CommitNumber int, LastUpdate date)
declare @commit int

DECLARE db_cursor CURSOR FOR
SELECT DISTINCT [CommitNumber] FROM ProcessHistory ORDER BY [CommitNumber] DESC

OPEN db_cursor
fetch next from db_cursor into @commit

while @@FETCH_STATUS=0
BEGIN
    INSERT INTO @CommitDates ([CommitNumber], [LastUpdate]) 
    select top 1 [CommitNumber],LastUpdate from ProcessHistory WHERE [CommitNumber]=@commit ORDER BY LastUpdate ASC
    fetch next from db_cursor into @commit
END
CLOSE db_cursor
deallocate db_cursor
SELECT * from @CommitDates

预期结果:能够快速知道给定提交编号第一次出现在表中的日期,而无需拉起Subversion日志查看器。在这种情况下,我将“快速”定义为在不超过60秒的时间内执行。

实际结果:执行此代码需要花费7分30秒以上的时间,截至目前,该代码仅返回176行。

1 个答案:

答案 0 :(得分:0)

好吧,我觉得很傻,只是想通了:

从ProcessHistory GROUP BY [CommitNumber]中选择[CommitNumber],MIN([LastUpdate])

从字面上00:00:02执行