关闭

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

1031人阅读 评论(0) 收藏 举报

     定义游标的时候, 可以指定一些选项,以提高游标使用的性能。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


 

 

 

0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:511165次
    • 积分:6302
    • 等级:
    • 排名:第3900名
    • 原创:100篇
    • 转载:131篇
    • 译文:4篇
    • 评论:44条
    文章分类
    淘宝网店推荐
    最新评论