如何加快使用游标的查询?

时间:2016-09-14 12:06:22

标签: sql-server

我正在尝试构建一个SQL查询,该查询在时间戳表中的两个后续行上执行DateDiff。该查询显示时间戳之间有多少毫秒。我的初始解决方案使用游标来获取行。然而,这很慢,特别是因为我处理超过170k的行。这是查询:

declare cur cursor for
select timestamp from TimeStamps
declare @firststamp datetime2
declare @secondstamp datetime2
fetch next from cur into @firststamp
while (@@FETCH_STATUS = 0)
begin
    fetch next from cur into @secondstamp
    print(DateDiff(millisecond, @firststamp, @secondstamp))
    set @firststamp = @secondstamp
end
close cur
deallocate cur

有没有办法可以加快速度? 另外,是否有我可以编写的替代查询来获得所需的结果?

1 个答案:

答案 0 :(得分:3)

在SQL Server 2012+中,您可以使用lag()执行此操作:

select t.*,
       datediff(millisecond, lag(timestamp) over (order by timestamp),
                timestamp) as diff_ms
from t;

根据问题中查询的语法,我忽略了数据库标记。