我有两个简单的脚本 一个是:
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
答案 0 :(得分:3)
静态游标,运行查询,结果存储在tempdb中,然后迭代它。
所以基本上它是一个只读副本,不需要与底层数据同步,因此不需要锁等。
没有意识到它有那么大的开销,我再次花费了很多精力来完全不使用游标,除了一个关闭管理任务。