insert into select执行时间很长
我在pl/sql developer里面执行
INSERT INTO PRODUCTION(OPERATIONID,STARTDATE,ENDDATE,PRODUCTIONQUANTITY,UNITOFMEASURECODE,DEACTIVATE,IMPORTID,SOURCEID,LASTMODIFIEDDATE,USER01NUMBER,USER02NUMBER,USER03NUMBER,USER01FIELD,USER02FIELD,USER03FIELD)
(SELECT OPERATION.OPERATIONID, V_PRODUCTION .STARTDATE, V_PRODUCTION .ENDDATE, V_PRODUCTION .PRODUCTIONQUANTITY, V_PRODUCTION .UNITOFMEASURECODE, V_PRODUCTION .DEACTIVATE, V_PRODUCTION .IMPORTID, V_PRODUCTION .SOURCEID, V_PRODUCTION .RUNDATE, V_PRODUCTION .USER01NUMBER, V_PRODUCTION .USER02NUMBER, V_PRODUCTION .USER03NUMBER, V_PRODUCTION .USER01FIELD, V_PRODUCTION.USER02FIELD, V_PRODUCTION .USER03FIELD
FROM V_PRODUCTION
inner join OPERATION on OPERATION.operationcode = V_PRODUCTION .OperationCode
);
commit;
V_PRODUCTION 是一个视图,问题是这条语句执行了好长时间都不结束,select语句单独执行是成功的,而且就7条数据这是为什么?本人刚刚从sqlserver转过来,不是特别清楚啊,谢谢
[解决办法]
如果7条数据是比较迅速的,检查锁.
[解决办法]
试试
create table PRODUCTION_test
(SELECT OPERATION.OPERATIONID, V_PRODUCTION .STARTDATE, V_PRODUCTION .ENDDATE, V_PRODUCTION .PRODUCTIONQUANTITY, V_PRODUCTION .UNITOFMEASURECODE, V_PRODUCTION .DEACTIVATE, V_PRODUCTION .IMPORTID, V_PRODUCTION .SOURCEID, V_PRODUCTION .RUNDATE, V_PRODUCTION .USER01NUMBER, V_PRODUCTION .USER02NUMBER, V_PRODUCTION .USER03NUMBER, V_PRODUCTION .USER01FIELD, V_PRODUCTION.USER02FIELD, V_PRODUCTION .USER03FIELD
FROM V_PRODUCTION
inner join OPERATION on OPERATION.operationcode = V_PRODUCTION .OperationCode
);
如果这样快了,检查PRODUCTION表里是否有锁.
如果这样速度也慢,检查select count(1) FROM V_PRODUCTION
inner join OPERATION on OPERATION.operationcode = V_PRODUCTION .OperationCode
确认查询出来的结果的确是7,再检查下optimizer_mode参数值,看设置成CHOOSE会不会快一些。
[解决办法]
锁的发生情况很多....
比如,某一个事务正在修改这个表的数据,另外一个事务也要修改这个表的数据.
比如,你某个同事SELECT * FROM XXX FOR UPDATE,你也恰好在执行UPDATE XXX SET
比如,在某个过程中,正在UPDATE ,恰好,你也在UPDATE
这些都可能会导致加锁.
这个是我之前的一篇模拟加锁的小测试:
http://blog.csdn.net/ziwen00/article/details/6331037
试一下,就很明白了.
[解决办法]
可以join v$Lock v$Lock 获得谁在block谁
select a.sid
[解决办法]
' is blocking '
[解决办法]
b.sid from v$lock a,v$Lock b where a.id1=b.id1 and a.id2=b.id2 and a.block=1 and b.request>0;