[SQL Server] 合理选择游标类型(static,dynamic),提升性能

     定义游标的时候, 可以指定一些选项,以提高游标使用的性能。static,dynamic, FAST_FORWARD。

     static: 定义一个游标,以创建将由该游标使用的数据的临时复本。对游标的所有请求都从 tempdb 中的这一临时表中得到应答;因此,在对该游标进行提取操作时返回的数据中不反映对基表所做的修改,并且该游标不允许修改。

 

     如果不指定STATIC 关键字的时候, 则默认定义的游标是动态(DYNAMIC) 的

动态(DYNAMIC) 游标会反映在滚动游标时对结果集内的各行所做的所有数据更改。行的数据值、顺序和成员身份在每次提取时都会更改。动态游标不支持ABSOLUTE 提取选项。

因为动态游标会消耗资源去检查基础表的更新, 所以对于复杂的查询, 且不需要反映基础表更新情况的游标处理中, 将游标定义为静态的。另外,还有一种 KEYSET 类型的游标,它的行为介于动态和静态游标之间。

 

在笔者遇到的一个案例中, 使用动态游标的处理会花费分钟, 而改为静态游标后, 处理时间只需要1 秒钟, 效率的差异非常明显

 

另外, 在使用 DYNAMIC 游标的时候, 必须注意“行的数据值、顺序和成员身份在每次提取时都会更改”的问题。

 

-- 下面是一个看似正常, 但实际执行会造成死循环的示例SET NOCOUNT ON


 

-- 建立测试环境

DECLARE @tb TABLE(

    id int

        PRIMARY KEY)

INSERT @tb(

    id)

SELECT id = 1 UNION ALL

SELECT id = 2

 

-- 游标处理

DECLARE tb CURSOR LOCAL FAST_FORWARD

FOR

SELECT id FROM @tb

DECLARE @id int

OPEN tb

FETCH tb INTO @id

WHILE @@FETCH_STATUS = 0

BEGIN

    PRINT @id

    UPDATE @tb SET

        id = id + 2

    WHERE id = @id

    FETCH tb INTO @id

END

CLOSE tb

DEALLOCATE tb


 

 

 

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值