日期:2014-05-18  浏览次数:20817 次

中秋了,提两个问题:1听说游标性能很差,FAST_FORWARD可以提高性能吗?
SCROLL

指定所有的提取选项(FIRST、LAST、PRIOR、NEXT、RELATIVE、ABSOLUTE)均可用。如果在   SQL-92   DECLARE   CURSOR   中未指定   SCROLL,则   NEXT   是唯一支持的提取选项。如果指定   SCROLL,则不能也指定   FAST_FORWARD

FORWARD_ONLY

指定游标只能从第一行滚动到最后一行。FETCH   NEXT   是唯一受支持的提取选项。如果在指定   FORWARD_ONLY   时不指定   STATIC、KEYSET   和   DYNAMIC   关键字,则游标作为   DYNAMIC   游标进行操作。如果   FORWARD_ONLY   和   SCROLL   均未指定,除非指定   STATIC、KEYSET   或   DYNAMIC   关键字,否则默认为   FORWARD_ONLY。STATIC、KEYSET   和   DYNAMIC   游标默认为   SCROLL。与   ODBC   和   ADO这类数据库   API   不同,STATIC、KEYSET   和   DYNAMIC   Transact-SQL   游标支持   FORWARD_ONLY。FAST_FORWARD   和   FORWARD_ONLY   是互斥的;如果指定一个,则不能指定另一个。

FAST_FORWARD

指定启用了性能优化的   FORWARD_ONLY、READ_ONLY   游标。如果指定   FAST_FORWARD,则不能也指定   SCROLL   或   FOR_UPDATE。FAST_FORWARD   和   FORWARD_ONLY   是互斥的;如果指定一个,则不能指定另一个。

READ_ONLY

禁止通过该游标进行更新。在   UPDATE   或   DELETE   语句的   WHERE   CURRENT   OF   子句中不能引用游标。该选项替代要更新的游标的默认功能。

-----
STATIC

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

KEYSET

指定当游标打开时,游标中行的成员资格和顺序已经固定。对行进行唯一标识的键集内置在   tempdb   内一个称为   keyset   的表中。对基表中的非键值所做的更改(由游标所有者更改或由其它用户提交)在用户滚动游标时是可视的。其他用户进行的插入是不可视的(不能通过   Transact-SQL   服务器游标进行插入)。如果某行已删除,则对该行的提取操作将返回   @@FETCH_STATUS   值   -2。从游标外更新键值类似于删除旧行后接着插入新行的操作。含有新值的行不可视,对含有旧值的行的提取操作将返回   @@FETCH_STATUS   值   -2。如果通过指定   WHERE   CURRENT   OF   子句用游标完成更新,则新值可视。

DYNAMIC

定义一个游标,以反映在滚动游标时对结果集内的行所做的所有数据更改。行的数据值、顺序和成员在每次提取时都会更改。动态游标不支持   ABSOLUTE   提取选项。


------解决方案--------------------
STATIC+LOCAL+FAST_FORWARD
------解决方案--------------------
游标就是逐条数,性能当然不如直接查询.
用FAST_FORWARD应该相差不大.
需求的时候就用吧!对几千条数据,逐条数还是没什么问题的.
有些问题,不用游标不行.
------解决方案--------------------
学习
------解决方案--------------------
FAST_FORWARD的确可以提升性能,但是非常有限。建议能不用游标尽可能不要用。
------解决方案--------------------
选择适合应用的游标类型是限制游标性能问题的方法,楼主已经开始关注这个问题了

------解决方案--------------------
游标不好,但是也有存在的理由。
------解决方案--------------------
游标不好,但有時不得不用