[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...
  • kk185800961
  • kk185800961
  • 2015年07月15日 18:15
  • 951

提高SQL Server性能

如何提高SQL Server的性能 提供SQL Server性能总的来说有两种方式: 1、扩容,提高服务器性能,显著提高CPU、内存,解决磁盘I/O瓶颈。 2、优化应用程序 引起数据性能问题主要原因:...
  • kangkanglou
  • kangkanglou
  • 2016年12月02日 20:58
  • 959

SQL Server中用While循环替代游标(Cursor)的解决方案

By行处理数据,推荐2种方式: 1、游标 2、While循环 我们来了解下这两种方案处理1w行数据分别需要多长时间。 一、游标。 首先我们填充一个表,用优雅的递归方式填充...
  • a5685263
  • a5685263
  • 2016年07月29日 17:36
  • 2974

SQL Server 2008 游标使用实例

本文使用以下两张数据库表作为演示对象。 1 游标初探--使用游标进行遍历 declare @classAndStudent table( class_id int, ...
  • tiana0
  • tiana0
  • 2013年10月12日 10:22
  • 7354

使用sql server游标修改数据

使用sql server游标修改数据:在查询分析器中声明变量,并设置@id变量的值,然后声明一个游标并打开该游标,使用FETCH NEXT方法来获取游标的下一行数据,并将此数据赋值给变量,如果F ...
  • rart2008
  • rart2008
  • 2010年07月22日 18:18
  • 6081

sqlserver 游标存储过程实例

--建时间表CREATE TABLE [dbo].[TIME]( [ID_] [varchar](32) COLLATE Chinese_PRC_CI_AS NULL, [YEAR_] [varcha...
  • wengyupeng
  • wengyupeng
  • 2008年12月09日 13:49
  • 2744

Sql Server 游标(利用游标逐行更新数据)、存储过程

游标中用到的函数,就是前一篇文章中创建的那个函数。 另外,为了方便使用,把游标放在存储过程中,这样就可以方便地直接使用存储过程来执行游标了。 1 create procedure Upd...
  • chihen
  • chihen
  • 2014年10月23日 16:11
  • 4564

SQLSERVER游标及循环语句

整理一下,关于游标,MSDN有:过 Transact-SQL 服务器游标检索特定行。
  • luminji
  • luminji
  • 2010年01月04日 16:04
  • 69246

不支持此游标类型/并发组合

在Sql Server2005中: com.microsoft.sqlserver.jdbc.SQLServerException: 不支持此游标类型/并发组合。 使用sqljdbc.ja...
  • muzai
  • muzai
  • 2013年05月09日 19:48
  • 1429

TVP批量插入数据

1. Sql2008 使用TVP批量插入数据 - BarneyZhang - 博客园 http://www.cnblogs.com/zhxhdean/archive/2013/07/28/322073...
  • xxmeng2012
  • xxmeng2012
  • 2015年08月26日 18:56
  • 618
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:[SQL Server] 合理选择游标类型(static,dynamic),提升性能
举报原因:
原因补充:

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