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

原创 2011年01月19日 11:07:00

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


 

 

 

SqlServer 游标选项说明及测试

USE [Temp] GO -- 创建测试表 CREATE TABLE [dbo].[CURTAB]( [Guid] [uniqueidentifier] NOT NULL, [N...

Sql Server查询性能优化之创建合理的索引

http://www.cnblogs.com/lzrabbit/archive/2012/06/11/2517963.html  本文主要作为优化查询性能的一些知识储备,感觉知识点有些散,不知道...

Sql Server查询性能优化之创建合理的索引(下篇)

原文链接:http://www.cnblogs.com/lzrabbit/archive/2012/07/03/2549558.html 数据库索引分为聚集索引和非聚集索引,聚集索引就是物理索引,也...

Sql Server查询性能优化之创建合理的索引(上篇)

原文链接:http://www.cnblogs.com/lzrabbit/archive/2012/06/11/2517963.html 本文主要作为优化查询性能的一些知识储备,感觉知识点有...

建立合理的索引提高SQL Server的性能

建立合理的索引提高SQL Server的性能- 标签:索引,性能优化 建立合理的索引提高SQL Server的性能 在应用系统中,尤其在联机事务处理系统中,对数据查询及处理速度已成为衡量应用系统...

Sql Server查询性能优化之创建合理的索引(下篇)

   数据库索引分为聚集索引和非聚集索引,聚集索引就是物理索引,也就是数据的物理的存储顺序,聚集索引的叶子节点就是数据行本身;非聚集索引是逻辑索引,也可以简单的认为是对聚集索引建立的索引,一般来...

SQL Server数据库学习之 -- 存储过程-游标-表值类型综合运用

我在公司工作中,根据项目中的需求,需要编写存储过程,进行对数据批量处理。考虑到对公司源码保密,对此,我简化了公司开发中编写存储过程的内容,以另一个场景将所运用到的知识写下来: USE [B2C2]...

SQL SERVER 合理的索引,会加快数据查询效率,但若索引过多或不当,则会适得其反

大多数SQL Server表需要索引来提高数据的访问速度,如果没有索引SQL Server要进行表格扫描读取表中的每一个记录才能找到索要的数据。          为什么不对表中的每一个列创建一个索...

SQL Server 2016新特性:动态数据屏蔽(Dynamic Data Masking)

动态数据屏蔽是SQL Server 2016引入的一项新的特性,通过数据屏蔽,你可以对非授权用户限制敏感数据的曝光。动态数据屏蔽会在查询结果集里隐藏指定栏位的敏感数据,而数据库中的实际数据并没有任何...

SQL SERVER游标示例

  • 2012年11月05日 19:43
  • 894B
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:[SQL Server] 合理选择游标类型(static,dynamic),提升性能
举报原因:
原因补充:

(最多只允许输入30个字)