SQL Server游标的使用

游标是穷凶极恶之!

      
在关系数据库中,我们于查询的思量是面向集的。而游标打破了立同一条条框框,游标使得我们想方式改为逐行进行.对于类C的开发人员来在,这样的考虑方式会愈发舒适。

       正常面向集的合计方式是:

       图片 1

       而于游标来说:

       图片 2

     
这为是干什么游标是邪恶之,它见面如开发人员变懒,懒得去想就此面向集的询问艺术贯彻某些功能.

     
同样的,在性能上,游标会吃还多之内存,减少可用的出现,占用宽带,锁定资源,当然还有更多之代码量……

     
从游标对数据库的读取方式吧,不难看出游标为什么占用更多之资源,打个假设:

          图片 3

      当您于ATM取钱的时,是同样差获1000效率还胜似啊,还是赢得10软100?

 

 

既然如此游标这么“邪恶”,为什么还要学习游标

      我个人觉得有既是合理.归结来说,学习游标原因我概括为以下2点

    1.现存系统出一些游标,我们询问必须经游标来兑现

   
2.看作一个备用方式,当我们彻底尽矣while循环,子查询,临时表,表变量,自盖函数或其它方式扔来无法实现某些查询的早晚,使用游标实现.

 

T-SQL中游标的生命周期以及贯彻

    在T-SQL中,游标的生命周期由5局部构成

1.概念一个游标

    
在T-SQL中,定义一个游标可以是非常简单,也足以相对复杂,取决于游标的参数.而游标的参数设置取决于你针对游标原理的打听程度.

    
游标其实可以清楚成一个定义在一定数据集齐之指针,我们得以操纵是指针遍历数据集,或者只有是指为特定的行,所以游标是概念在因为Select开始的数目集上的:

 

     图片 4

 

     T-SQL中之游标定义在MSDN中如下:

 

DECLARE cursor_name CURSOR [ LOCAL | GLOBAL ] 
     [ FORWARD_ONLY | SCROLL ] 
     [ STATIC | KEYSET | DYNAMIC | FAST_FORWARD ] 
     [ READ_ONLY | SCROLL_LOCKS | OPTIMISTIC ] 
     [ TYPE_WARNING ] 
     FOR select_statement 
     [ FOR UPDATE [ OF column_name [ ,...n ] ] ]
[;]

    

 

 

   看起挺为人头痛是吧.下面细讲一下哪定义游标:

  
游标分为游标类型及游标变量,对于游标变量来说,遵循T-SQL变量的定义方法(啥,不亮堂T-SQL变量定义之平整?参考我面前的博文).游标变量支持少数栽方法赋值,定义时赋值和先定义后赋值,定义游标变量像定义其他一些变量一样,在游标前加”@”,注意,如果定义全局的游标,只支持定义时一直赋值,并且不可知当游标名称前加“@”,两种植概念方式如下:

    图片 5

    下面我们来拘禁游标定义之参数:

     LOCAL和GLOBAL二选一

     LOCAL意味着游标的在周期就在批判处理或者函数或存储过程被凸现,而GLOBAL意味着游标对于特定连接作上下文,全局内立竿见影,例如:

     图片 6

     如果不点名游标作用域,默认作用域为GLOBAL

 

     FORWARD_ONLY 和 SCROLL 二选一

     FORWARD_ONLY意味着游标只能从数量集开头向数集了之势头读取,FETCH
NEXT是唯一的挑项,而SCROLL支持游标在概念之数量集中向外方向,或任何位置走,如下图:

     图片 7

    

    STATIC  KEYSET  DYNAMIC  和 FAST_FORWARD 四选一

    这四个主要字是游标所在数据集所反应的表内数据与游标读取出之多少的关系

   
STATIC意味着,当游标被立时,将会见创FOR后面的SELECT语句所包含数据集的副本存入tempdb数据库中,任何对于底层表内数据的改观不会见潜移默化到游标的内容.

   
DYNAMIC是跟STATIC完全相反的选择项,当脚数据库更改时,游标的情节吗跟着得到体现,在生一致次等fetch中,数据内容会跟着改变

   
KEYSET可以掌握呢在STATIC和DYNAMIC的折中方案。将游标所在结果集的唯一会确定各级一行的主键存入tempdb,当结果集中外履行改变或去时,@@FETCH_STATUS会为-2,KEYSET无法探测新入的多少

   
FAST_FORWARD可以解成FORWARD_ONLY的优化版本.FORWARD_ONLY执行之是静态计划,而FAST_FORWARD是依据气象展开选择用动态计划还是静态计划,大多数情景下FAST_FORWARD要比FORWARD_ONLY性能聊好.

 

    READ_ONLY  SCROLL_LOCKS  OPTIMISTIC 三选一      READ_ONLY意味着声明的游标只能读取数据,游标不克开另外更新操作

   
SCROLL_LOCKS是其他一样种植最,将读入游标的所有数据开展锁定,防止其他程序进行变更,以保更新的绝对成功

   
OPTIMISTIC是相对比好的一个选,OPTIMISTIC不锁定任何数据,当得在游标中更新数据经常,如果底层表数据更新,则游标内数据更新不成事,如果,底层表数据不更新,则游标内表数据可以创新

  

 

 

2.开拓游标

    当定义了游标后,游标需要开辟后使,只有简单一行代码:

OPEN test_Cursor

    注意,当全局游标和有游标变量重名时,默认会打开局部变量游标

3.运游标

 

  
游标的以分为两片段,一部分凡操作游标在数据集内的对准,另一样部分是以游标所针对的执行之一部分或全部内容进行操作

  
只有支持6种运动选项,分别吗到第一尽(FIRST),最后一尽(LAST),下一行(NEXT),上一行(PRIOR),直接跨越到某行(ABSOLUTE(n)),相对于当下越几推行(RELATIVE(n)),例如:

     图片 8

    对于未指定SCROLL选项之游标来说,只支持NEXT取值.

    第一步操作完后,就透过INTO关键字用这行的价值传入局部变量:

    比如下面代码:

    图片 9

    图片 10

 

    
游标经常会面和全局变量@@FETCH_STATUS与WHILE循环来共同采取,以达到遍历游标所在数据集的目的,例如:

    图片 11

 

4.关游标

    在游标使用了事后,一定要记关闭,只需要一行代码:CLOSE+游标名称

CLOSE test_Cursor

 

 

 

 

 

5.保释游标

    当游标不再需要给采取后,释放游标,只需要一行代码:DEALLOCATE+游标名称

DEALLOCATE test_Cursor

 

对游标一些优化建议

  •      如果能毫无游标,尽量不要采用游标
  •      用完用完之后定要关门和放
  •      尽量不要当大气多少及定义游标
  •      尽量不要采取游标上创新数据
  •      尽量不要采用insensitive, static和keyset这些参数定义游标
  •      如果可以,尽量用FAST_FORWARD关键字定义游标
  •      如果仅仅对数据开展读取,当读取时不过所以到FETCH
    NEXT选项,则太好用FORWARD_ONLY参数

 

总结

    
本文从游标的基本概念,到生命周期来提游标。游标是老大邪恶的等同种植在,使用游标经常会面比使用面向集的法门慢2-3倍,当游标定义在怪数据量时,这个比例尚会见增加。如果可能,尽量使while,子查询,临时表,函数,表变量等来顶替游标,记住,游标永远只有是公说到底不得已之下的挑选,而无是首选。

 

游标是邪恶之!

相关文章