我在这里缺少什么?我正在尝试测试识别长时间运行的查询。
我有一个名为mytest的大约4亿行的测试表。
我在sqlplus中运行select * from mytest
在另一个窗口中,我运行下面的脚本来查看我长时间运行的查询
select s.username, s.sid, s.serial#, s.schemaname,
s.program, s.osuser, s.status, s.last_call_et
from v$session s
where last_call_et >= 1 – this is just for testing
我长时间运行的查询未显示在上述查询的结果中。如果我将条件更改为> = 0,那么我看到我的查询显示状态为INACTIVE,而last_call_et为0,尽管查询仍在运行。我可以做些什么来查看我长期运行的查询,例如上面的select * from...
,以便我可以杀死它?
由于
答案 0 :(得分:1)
首先,您需要了解select * from mytest
之类的查询在封面下的实际操作情况,因为这通常不会是长时间运行的查询。 Oracle并不需要实现该结果集,也不会因为单个调用而读取所有数据。相反,接下来发生的是一系列调用,每个调用都会导致Oracle做一些工作。谈话就是这样的。
select * from mytest
last_call_et
重置为0以反映新的呼叫已开始)。我已经生成了一个查询计划并打开了一个光标,
这是一个句柄(请注意,实际上还没有完成任何工作
执行查询)last_call_et
重置为0以反映新呼叫已启动)。我开始全面扫描桌子,读了几张
块,并获得50行。干得好。 在这个过程中,Oracle从来没有被要求做更多的事情而是阅读少量的块以获得50行(或者客户端请求的任何提取大小)。在任何时候,客户端都可能根本不会请求下一批数据,因此Oracle不需要长时间运行。 Oracle没有跟踪应用程序在更多数据请求之间的思考时间 - 它不知道客户端是否是一个紧密循环获取数据的GUI,或者它是否向人类显示结果并等待人类要打'下一个"按钮。在绝大多数情况下,会话将是INACTIVE
,因为它主要等待客户端请求下一批数据(在格式化之前它通常会胜出最后一批数据用于显示并完成工作以显示它。)
当大多数人谈论长时间运行的查询时,他们会谈论Oracle在相对较长时间内主动处理的查询,而无需等待客户端获取数据。
答案 1 :(得分:0)
您可以使用以下脚本查找长期运行的查询:
select * from
(
select
opname,
start_time,
target,
sofar,
totalwork,
units,
elapsed_seconds,
message
from
v$session_longops
order by start_time desc
)
where rownum <=1;