t-sql:游标和游标静态之间的性能差异

时间:2014-03-30 18:30:42

标签: sql-server cursor

我有两个简单的脚本 一个是:

declare @active_from date = '01.03.2014'
declare @active_to date = '01.04.2014'
declare @house_id integer = 11927
----
    declare @service_id integer
    declare @addendum_id integer
    declare @activity_id integer
    declare @session_id integer
    declare @cur_active_from datetime
    declare @cur_active_to datetime
    declare @session_license_fee_cur cursor
    -- prepare cursor
        set @session_license_fee_cur =  cursor static for 
        select activity_id
                , addendum_id
                , service_id
                , active_from
                , active_to
        from dbo.bills_supp_get_activate_license_fee_for_sessions_by_house(@active_from, @active_to, @house_id)
    -- open cursor
    open @session_license_fee_cur
    fetch next from @session_license_fee_cur into @activity_id, @addendum_id, @service_id, @cur_active_from, @cur_active_to
    while (@@FETCH_STATUS = 0)
    begin
        -- get next record
        fetch next from @session_license_fee_cur into @activity_id, @addendum_id, @service_id, @cur_active_from, @cur_active_to
    end
    -- 
    close @session_license_fee_cur
    deallocate @session_license_fee_cur

它的工作时间不到一秒钟。 第二个是相同的,而是

set @session_license_fee_cur =  cursor static for

我用

set @session_license_fee_cur =  cursor for

没有"静态"。它的工作时间超过1分钟。 为什么这种性能差异? 查询中的计数记录大约为3000

1 个答案:

答案 0 :(得分:3)

静态游标,运行查询,结果存储在tempdb中,然后迭代它。

所以基本上它是一个只读副本,不需要与底层数据同步,因此不需要锁等。

没有意识到它有那么大的开销,我再次花费了很多精力来完全不使用游标,除了一个关闭管理任务。