3

在您的应用程序中,在提交或回滚之前保持事务打开的“长时间”是多少?分钟?秒?小时?

在哪个数据库上?

4

5 回答 5

8

我可能会为此大发雷霆,但你真的应该尽量避免使用游标,因为它们会严重影响性能。如果你必须使用它,你应该尽可能保持打开它的绝对最短时间,以便尽快释放被游标阻塞的资源。

于 2008-08-14T06:10:46.197 回答
5

交易:分钟。

光标:最多 0 秒,如果您使用光标,我们会解雇您。

当您考虑到我们处于一个必须运行 sql server 的高可用性 Web 环境中时,这并不荒谬,而且由于无法准确地对它们进行版本化和维护,我们甚至不允许存储过程。如果我们使用 oracle 可能。

于 2008-08-14T06:10:22.983 回答
2

一般来说,我同意其他答案:尽可能避免使用游标(在大多数情况下)并尽快关闭它们。

但是:这完全取决于您工作的环境。

  • 如果它是一个拥有大量用户的生产网站环境,请确保光标在有人超时之前消失。
  • 如果您 - 例如 - 在不执行其他任何操作的专有机器上编写“日志分析存储过程”(或其他):随意做任何您想做的事情。你将是唯一需要等待的人。数据库服务器不会因为您使用游标而死掉。但是,您应该考虑到,使用行为可能会随着时间而改变,并且在某个时候可能有 10 个人在使用该应用程序。所以尝试寻找另一种方式;)
于 2008-08-14T07:34:12.470 回答
2

@lomaxx,@ChanChan:据我所知,游标只是 SQL Server 和 Sybase(T-SQL 变体)上的问题。如果您选择的数据库是 Oracle,那么游标就是您的朋友。我见过许多使用游标实际上提高了性能的案例。游标是一种非常有用的机制,而且说“如果你使用游标,我们就会解雇你”之类的话有点荒谬。

话虽如此,您只想将光标保持在所需的绝对最小值。如果不了解问题域,指定最大时间将是任意且毫无意义的。

于 2008-08-14T08:59:38.023 回答
2

@nineside:抛开性能问题不谈,这也是关于使用正确的工具来完成这项工作。考虑到将光标从查询中移出到代码中的选择,我认为 100 次中有 99 次最好将循环逻辑放入某种托管代码中。这样做可以让您获得使用调试器、编译时错误检查、类型安全等的优势。

我对这个问题的回答仍然是一样的,如果您使用的是游标,请尽快关闭它,在 oracle 中我也会尝试使用显式游标。

于 2008-08-14T13:05:04.733 回答