让光标保持打开状态是众所周知的不好做法。但是,当您忘记关闭和/或释放它时,会发生什么呢?它对SQL Server、连接/会话有何影响?使用游标的查询、存储过程和触发器的结果有什么不同吗?
发布于 2012-03-08 00:52:08
这取决于您是将游标声明为本地游标还是全局游标(以及您的环境中的默认值-默认值是全局的,但您可以更改它)。
如果游标是全局的,则它可以在SQL Server中保持“活动”状态,直到在创建它的作用域中接触到最后一段代码。例如,如果调用一个创建全局游标的存储过程,然后调用20个其他存储过程,则在运行其他20个存储过程时,游标将继续存在,直到调用方超出作用域。我相信它将保持在会话级别,而不是连接级别,但还没有彻底测试这一点。如果游标被声明为local,那么它应该只停留在当前对象的作用域中(但同样,这只是理论上的,我还没有做过大量的低级内存测试来确认)。
然而,一般的概念应该是:当你做完某件事时,就说出来。
为了使我的游标尽可能高效,我总是使用以下声明:
DECLARE c CURSOR
LOCAL STATIC FORWARD_ONLY READ_ONLY
FOR SELECT ...
我还听说,如果只使用CLOSE
或只使用DEALLOCATE
,可能会出现内存问题,所以我总是在完成后同时使用这两种方法:
CLOSE c;
DEALLOCATE c;
但是,在清理此语法有问题的情况下,您有多少游标?如果您的系统中有数百个光标,这对我来说肯定是一个危险信号。
编辑
作为补充,我只想澄清一下,游标本身并不是坏事。它们经常被误用和滥用--在本可以实现更有效的、基于集合的解决方案的情况下实现,但负责编写查询的人只能从程序上进行思考。以下是游标有意义的几种情况:
发布于 2014-08-06 17:40:52
“游标变量不必显式释放。当变量超出作用域时,它会被隐式释放。“
发布于 2012-03-08 01:04:55
不关闭游标将使它所在行上的锁保持活动状态。即使在关闭之后,仍然保留对游标正在使用的数据结构的引用(以便可以重新打开),这些结构是特定于SQL server的(因此,它不仅仅是内存空间或句柄等),并且取决于游标的实际操作,但它们通常是临时表或查询结果集。
不释放AFAIK只与性能有关。上述资源将保持分配状态,因此会对服务器性能产生负面影响。
从(打开或关闭,但未解除分配)游标分配的资源将保持已分配状态,直到会话(或连接)关闭
https://stackoverflow.com/questions/9605683
复制相似问题