2014-03-30 46 views
2

之间的性能差异,我有两个简单的脚本 之一是:吨-SQL:光标和光标静态

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

回答

3

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

所以基本上它是一个只读副本,无需与底层数据同步,所以不需要锁和这样的。

没有意识到它有多大的开销的是,有一次我投入了大量的精力不使用游标在所有的任何东西,除了一次性管理任务。