首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >当您忘记关闭和释放游标时会发生什么?

当您忘记关闭和释放游标时会发生什么?
EN

Stack Overflow用户
提问于 2012-03-08 00:46:00
回答 3查看 32.1K关注 0票数 34

让光标保持打开状态是众所周知的不好做法。但是,当您忘记关闭和/或释放它时,会发生什么呢?它对SQL Server、连接/会话有何影响?使用游标的查询、存储过程和触发器的结果有什么不同吗?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-03-08 00:52:08

这取决于您是将游标声明为本地游标还是全局游标(以及您的环境中的默认值-默认值是全局的,但您可以更改它)。

如果游标是全局的,则它可以在SQL Server中保持“活动”状态,直到在创建它的作用域中接触到最后一段代码。例如,如果调用一个创建全局游标的存储过程,然后调用20个其他存储过程,则在运行其他20个存储过程时,游标将继续存在,直到调用方超出作用域。我相信它将保持在会话级别,而不是连接级别,但还没有彻底测试这一点。如果游标被声明为local,那么它应该只停留在当前对象的作用域中(但同样,这只是理论上的,我还没有做过大量的低级内存测试来确认)。

然而,一般的概念应该是:当你做完某件事时,就说出来。

为了使我的游标尽可能高效,我总是使用以下声明:

代码语言:javascript
运行
复制
DECLARE c CURSOR
  LOCAL STATIC FORWARD_ONLY READ_ONLY
  FOR SELECT ...

我还听说,如果只使用CLOSE或只使用DEALLOCATE,可能会出现内存问题,所以我总是在完成后同时使用这两种方法:

代码语言:javascript
运行
复制
CLOSE c;
DEALLOCATE c;

但是,在清理此语法有问题的情况下,您有多少游标?如果您的系统中有数百个光标,这对我来说肯定是一个危险信号。

编辑

作为补充,我只想澄清一下,游标本身并不是坏事。它们经常被误用和滥用--在本可以实现更有效的、基于集合的解决方案的情况下实现,但负责编写查询的人只能从程序上进行思考。以下是游标有意义的几种情况:

  • 运行总计。在我的测试中,游标将清除所有基于SQL 2012之前的基于集合的解决方案(至少是那些有文档记录的解决方案和supported0.
  • Various管理任务,例如,为表中的每一行或为每个表或database.
  • When调用存储过程)基于集合的替代方案极其复杂,或者任务是一次性的。
票数 32
EN

Stack Overflow用户

发布于 2014-08-06 17:40:52

“游标变量不必显式释放。当变量超出作用域时,它会被隐式释放。“

参考:http://msdn.microsoft.com/en-us/library/ms188782.aspx

票数 7
EN

Stack Overflow用户

发布于 2012-03-08 01:04:55

不关闭游标将使它所在行上的锁保持活动状态。即使在关闭之后,仍然保留对游标正在使用的数据结构的引用(以便可以重新打开),这些结构是特定于SQL server的(因此,它不仅仅是内存空间或句柄等),并且取决于游标的实际操作,但它们通常是临时表或查询结果集。

不释放AFAIK只与性能有关。上述资源将保持分配状态,因此会对服务器性能产生负面影响。

从(打开或关闭,但未解除分配)游标分配的资源将保持已分配状态,直到会话(或连接)关闭

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9605683

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档