有个insert into table select的SQL,select部分确实是慢了点儿,不过单独执行select部分4秒钟就能返回,但是如果执行insert into table select,是死活没有结果,其实select部分是没有返回数据的(也就是抽出结果为0条)。其他插入同一个table的SQL,如果select部分有结果的话,反而很快。谁能解释这种现象?
--楼主用下面的语句查询下,是不是有记录,如果有记录,就阻塞了,需要kill session select b.sid,b.machine,c.object_name,a.oracle_username, a.locked_mode,b.osuser, 'alter system kill session '''||b.sid||','||b.serial#||''';' from v$locked_object a,v$session b,all_objects c where a.session_id=b.sid and a.object_id=c.object_id;
加上 for update no wait 试试
谢谢大家的回复。表没锁,最后发现是执行计划的问题。 单独运行select部分,和运行insert into table select,其中select部分的执行计划居然差别很大。 后来把select里面exists部分,都改为inner join(被join字段做了group),居然速度很快,见鬼。
select b.sid,b.machine,c.object_name,a.oracle_username,
a.locked_mode,b.osuser,
'alter system kill session '''||b.sid||','||b.serial#||''';'
from v$locked_object a,v$session b,all_objects c
where a.session_id=b.sid and a.object_id=c.object_id;
试试
单独运行select部分,和运行insert into table select,其中select部分的执行计划居然差别很大。
后来把select里面exists部分,都改为inner join(被join字段做了group),居然速度很快,见鬼。