停止SQL代码执行

时间:2010-10-15 08:34:20

标签: sql database oracle sql-navigator

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

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

2 个答案:

答案 0 :(得分:5)

停止查询需要做两件事:

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

    一旦通知进程停止工作,就必须撤消它在此查询中已完成的所有内容(所有语句在Oracle中都是原子的,不能在不回滚的情况下在中间停止)。大多数情况下,在DML语句中,回滚将比已经完成的工作花费更长的时间(我看到它是这样的:Oracle优化为向前工作,而不是向后工作)。如果你是这种情况(大DML),你必须在回滚期间保持耐心,你没有太多办法来加快这个过程。

    如果您的查询是一个简单的SELECT并且您的工具不会让您取消,则可能会终止您的会话(需要来自其他会话的管理员权限) - 这应该是即时的。

答案 1 :(得分:1)

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

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