我们有一个庞大的Oracle数据库,我经常使用SQL Navigator(v5.5)获取数据。有时,我需要通过单击Stop
按钮来停止代码执行,因为我意识到我的代码中缺少部分。问题是,在点击Stop
按钮后,完成停止过程需要很长时间(有时需要数小时!)。该程序在底栏显示Stopping...
,我失去了很多时间直到完成。
这背后的理由是什么?如何加快停止过程?以防万一,我不是管理员;我是一个使用一些视图来访问数据库的有限用户。
答案 0 :(得分:5)
停止查询需要做两件事:
对于第一点,正在执行查询的Oracle进程应该不时检查它是否应该取消查询。即使它正在执行一项长任务(例如大HASH JOIN),我认为它每3秒左右检查一次(我正在寻找此信息的来源,如果我找到它,我会更新答案)。现在您的软件能够与Oracle正确通信吗?我不熟悉SLQ Navigator,但我认为取消机制应该像任何其他工具一样工作,所以我猜你在等待第二点:
一旦通知进程停止工作,就必须撤消它在此查询中已完成的所有内容(所有语句在Oracle中都是原子的,不能在不回滚的情况下在中间停止)。大多数情况下,在DML语句中,回滚将比已经完成的工作花费更长的时间(我看到它是这样的:Oracle优化为向前工作,而不是向后工作)。如果你是这种情况(大DML),你必须在回滚期间保持耐心,你没有太多办法来加快这个过程。
如果您的查询是一个简单的SELECT并且您的工具不会让您取消,则可能会终止您的会话(需要来自其他会话的管理员权限) - 这应该是即时的。
答案 1 :(得分:1)
取消查询时,Oracle客户端应发送OCIBreak(),但这不是在Windows服务器上实现的,这可能是原因。
另外,让您的DBA检查SQLNET.EXPIRE_TIME
的值。