3

我们有一个庞大的 Oracle 数据库,我经常使用 SQL Navigator (v5.5) 获取数据。有时,我需要通过单击Stop按钮来停止代码执行,因为我意识到我的代码中缺少部分。问题是,点击Stop按钮后,完成停止过程需要很长时间(有时需要几个小时!)。程序Stopping...在底部栏说,我失去了很多时间,直到它完成。

这背后的原因是什么?如何加快停止过程?以防万一,我不是管理员;我是使用某些视图访问数据库的受限用户。

4

2 回答 2

5

停止查询需要做两件事:

  1. 必须通知实际的 Oracle 进程您要取消查询
  2. 如果查询对数据库(DDL、DML)进行了任何修改,则需要回滚工作。

对于第一点,执行查询的 Oracle 进程应该不时检查它是否应该取消查询。即使它正在执行一项很长的任务(例如大 HASH JOIN),我认为它每 3 秒左右检查一次(我正在寻找此信息的来源,如果找到我会更新答案)。现在您的软件能够与 Oracle 正确通信了吗?我不熟悉 SLQ Navigator,但我认为取消机制应该与任何其他工具一样工作,所以我猜你正在等待第二点:

一旦进程被通知停止工作,它必须撤消它在这个查询中已经完成的所有事情(所有语句在 Oracle 中都是原子的,它们不能在中间停止而不回滚)。大多数情况下,在 DML 语句中,回滚所需的时间比已经完成的工作要长(我是这样看的:Oracle 被优化为向前工作,而不是向后工作)。如果你在这种情况下(大 DML),你将不得不在回滚过程中保持耐心,你可以做的事情不多来加快这个过程。

如果您的查询是一个简单的 SELECT 并且您的工具不允许您取消,您可以终止您的会话(需要另一个会话的管理员权限)——这应该是即时的。

于 2010-10-15T08:52:21.853 回答
1

当您取消查询时,Oracle 客户端应该发送OCIBreak()但这不是在 Windows 服务器上实现的,这可能是原因。

另外,让您的 DBA 检查SQLNET.EXPIRE_TIME.

于 2010-10-15T19:51:06.313 回答