我们拥有一台巨大的Oracle数据库,我经常使用SQL Navigator(v5.5)提取数据。有时候,当我意识到代码中存在缺失部分时,需要通过点击“停止”按钮来停止代码执行。然而问题是,在点击“停止”按钮之后,停止过程非常漫长(有时候需要数小时!)。程序在底部状态栏上显示“正在停止...”,直到完成,这浪费了我很多时间。这种情况的原理是什么?如何加快停止进程?请注意,我不是管理员,只是一个有限的用户,使用一些视图来访问数据库。
要停止查询需要两件事情:
对于第一点,执行查询的Oracle进程应该定期检查是否应该取消查询。即使它正在执行长时间的任务(例如大型HASH JOIN),我认为它每隔3秒左右就会检查一次(我正在寻找这些信息的来源,如果找到了,我会更新答案)。现在你的软件能够正确地与Oracle通信吗?我不熟悉SLQ Navigator,但我想取消机制应该像任何其他工具一样工作,所以我猜你正在等待第二点:
一旦进程被通知停止工作,它必须撤消已经完成的查询中的所有操作(在Oracle中,所有语句都是原子性的,不能在中途停止而不回滚)。大多数情况下,在DML语句中,回滚所需的时间将比已经完成的工作时间更长(我认为Oracle被优化为向前工作,而不是向后)。如果你处于这种情况(大型DML),你将不得不耐心等待回滚,没有什么可以加快这个过程。
如果你的查询是一个简单的SELECT,而你的工具不允许你取消,你可以杀死你的会话(需要从另一个会话获得管理员权限)--这应该是瞬间完成的。
当您取消一个查询时,Oracle 客户端应该发送 OCIBreak(),但在 Windows 服务器上没有实现,这可能是原因。
此外,请让您的 DBA 检查 SQLNET.EXPIRE_TIME
的值。
SELECT
语句获取数千行数据(最多250,000行)。SQL Navigator是我们公司长期使用的授权软件。我没有遇到过任何连接问题。所以杀死我的会话是最好的选择,对吗? - Mehper C. Palavuzlar