gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 19:23:19 25 4
gpt4 key购买 nike

让光标保持打开状态是一种不好的做法。

  • 但是当您忘记关闭和/或解除分配它时,到底会发生什么?
  • 它如何影响 SQL Server、连接/ session ?
  • 使用游标的查询、存储过程和触发器的结果有什么不同吗?

最佳答案

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

如果游标是全局的,那么它可以在 SQL Server 中保持“事件”状态,直到在创建它的范围内触及最后一段代码。例如,如果您调用创建全局游标的存储过程,然后调用其他 20 个存储过程,则游标将在其他 20 个存储过程运行时继续存在,直到调用者超出范围。我相信它将在 session 级别而不是连接级别保持事件状态,但尚未对此进行彻底测试。如果游标被声明为本地游标,那么它应该只保留在当前对象的范围内(但同样,这是理论上的,我还没有进行广泛的低级内存测试来确认)。

不过,一般概念应该是:当你完成某件事时,就说出来。

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

DECLARE c CURSOR
LOCAL STATIC FORWARD_ONLY READ_ONLY
FOR SELECT ...

我还听说,如果您仅CLOSE 或仅DEALLOCATE,则可能会出现内存问题,因此我总是在完成后同时执行这两种操作:

CLOSE c;
DEALLOCATE c;

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

编辑

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

  • 运行总计。在我的测试中,游标消除了 SQL 2012 之前的所有基于集的解决方案(至少是那些已记录和支持的解决方案0。
  • 各种管理任务,例如为表中的每一行或每个表或数据库调用存储过程。
  • 当基于集合的替代方案极其复杂,或者任务是一次性的时。

关于sql-server - 当您忘记关闭和释放游标时会发生什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9605683/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com