停止SQL代码执行

3
我们拥有一台巨大的Oracle数据库,我经常使用SQL Navigator(v5.5)提取数据。有时候,当我意识到代码中存在缺失部分时,需要通过点击“停止”按钮来停止代码执行。然而问题是,在点击“停止”按钮之后,停止过程非常漫长(有时候需要数小时!)。程序在底部状态栏上显示“正在停止...”,直到完成,这浪费了我很多时间。这种情况的原理是什么?如何加快停止进程?请注意,我不是管理员,只是一个有限的用户,使用一些视图来访问数据库。
2个回答

5

要停止查询需要两件事情:

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

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

一旦进程被通知停止工作,它必须撤消已经完成的查询中的所有操作(在Oracle中,所有语句都是原子性的,不能在中途停止而不回滚)。大多数情况下,在DML语句中,回滚所需的时间将比已经完成的工作时间更长(我认为Oracle被优化为向前工作,而不是向后)。如果你处于这种情况(大型DML),你将不得不耐心等待回滚,没有什么可以加快这个过程。

如果你的查询是一个简单的SELECT,而你的工具不允许你取消,你可以杀死你的会话(需要从另一个会话获得管理员权限)--这应该是瞬间完成的。


谢谢您的回答。让我进一步说明我的情况:我没有数据库修改权限,只能使用SELECT语句获取数千行数据(最多250,000行)。SQL Navigator是我们公司长期使用的授权软件。我没有遇到过任何连接问题。所以杀死我的会话是最好的选择,对吗? - Mehper C. Palavuzlar
@Mehper C. Palavuzlar:取消 SELECT 不应该花费太多时间(有些 SELECT 进行一些数据清理,但我不确定这是否实际上被回滚了——这只是维护工作,应该很少见)。取消按钮是否适用于小查询? - Vincent Malgrat
1
@Mehper C. Palavuzlar> 这肯定是客户端问题,为什么不尝试使用不同的客户端来测试它们的行为呢?(您可以获取许多免费或评估的客户端)。此外,当您说较小的查询和较大的查询时,您指的是什么?返回的行数?脚本的大小? - Unreason
@Unreason:抱歉,您所说的“客户端”是什么意思?通过更小和更大的查询,我指的是行数和脚本内容,例如计算、使用的函数、时间段(天数、月数、年数)、销售点数量等。想象一下一个包含所有在土耳其销售的杂志的各种数据的巨大数据库。 - Mehper C. Palavuzlar
@Mehper C. Palavuzlar,我的意思是前端 - 其中一些列在这里:https://dev59.com/90jSa4cB1Zd3GeqPCySg - Unreason
显示剩余2条评论

1

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

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接