关于选择游标类型

按照不同的变量选择游标类型,包括:

  • 结果集大小。

  • 很可能需要的数据的百分比。

  • 打开的游标的性能。

  • 需要的游标操作,如滚动或定位更新。

  • 由其他用户对数据所做修改的可见性级别。

如果无更新操作,则默认设置对于小结果集是适合的,但对于大结果集,使用动态游标更为适合,因为用户可能在检索许多行之前就可以找到答案。

如果将突然使用要检索的数据,而且无需已定位的更新或滚动操作,则建议使用默认结果集。在使用多个活动的结果集 (MARS) 时,SQL Server 消除了防止有多个未完成的默认结果集的限制。

选择游标类型的规则

选择游标类型时遵循的一些简单规则包括:

  • 尽可能使用默认结果集。如果需要滚动操作,将小结果集缓存在客户端,并在缓存中滚动而不是要求服务器实现游标,其效率可能更高。

  • 将整个结果集提取到客户端(如产生报表)时,使用默认设置。默认结果集是将数据传送到客户端的最快方式。

  • 如果应用程序正在使用定位更新,则不能使用默认结果集。

  • 默认结果集必须用于将生成多个结果集的 Transact-SQL 语句或 Transact-SQL 语句批。

  • 动态游标的打开速度比静态游标或由键集驱动的游标的打开速度快。当打开静态游标和由键集驱动的游标时,必须生成内部临时工作表,而动态游标则不需要。

  • 在联接中,由键集驱动的游标和静态游标的速度可能比动态游标的速度快。

  • 如果要进行绝对提取,必须使用由键集驱动的游标或静态游标。

  • 静态游标和由键集驱动的游标增加了 tempdb 的使用率。静态服务器游标在 tempdb 中创建整个游标,由键集驱动的游标则在 tempdb 中创建键集。

  • 如果游标在整个回滚操作期间必须保持打开状态,请使用同步静态游标,并将 CURSOR_CLOSE_ON_COMMIT 设为 OFF。

使用服务器游标时,对 API 提取函数或方法的每次调用都会产生一个到服务器的往返过程。应用程序应使用块状游标尽量减少这些往返过程,同时每次提取时返回适当数目的行。