日期:2014-05-16  浏览次数:21764 次

在线等分析,oracle的insert插入非常慢
现在有两台服务器一台是150,一台是144
昨天用150服务器上的plsql登录144的数据库并执行导入操作aa_distancehost_log,tmp_aa_distancehost_log均在144服务器上。
insert into tmp_aa_distancehost_log(log_datetime索引已建)
  select *
  from aa_distancehost_log t
  where t.log_datetime between
  to_date('2008-10-01 00:00:00 ', 'yyyy-mm-dd hh24:mi:ss') and
  to_date('2008-10-31 00:00:00', 'yyyy-mm-dd hh24:mi:ss');
commit;

在执行了大概1个小时后还在执行,不得已直接在plsql上中断连接,直到今早还是没有中断。不得已直接中断144服务器上的oracle进程。
但是现在150服务器上的oracle CPU占用一直在50%以上。
并且我现在把时间分一天天执行。insert 一天的数据就commit虽然非常慢但是总算导入了。
请高手分析下为什么144的服务器执行insert操作如此的慢,才200多万的数据。
还有150的机器为什么现在cpu占用率一直在50%以上


------解决方案--------------------
这个语句将查找到数据库中所有的DML语句产生的锁,还可以发现,任何DML语句其实产生了两个锁,一个是表锁,一个是行锁。 
可以通过alter system kill session ‘sid,serial#’来杀掉会话 
SELECT /*+ rule */ s.username, 
decode(l.type,'TM','TABLE LOCK', 
'TX','ROW LOCK', 
NULL) LOCK_LEVEL, 
o.owner,o.object_name,o.object_type, 
s.sid,s.serial#,s.terminal,s.machine,s.program,s.osuser 
FROM v$session s,v$lock l,dba_objects o 
WHERE l.sid = s.sid 
AND l.id1 = o.object_id(+) 
AND s.username is NOT NULL 
如果发生了锁等待,我们可能更想知道是谁锁了表而引起谁的等待 
以下的语句可以查询到谁锁了表,而谁在等待。 
SELECT /*+ rule */ lpad(' ',decode(l.xidusn ,0,3,0))||l.oracle_username User_name, 
o.owner,o.object_name,o.object_type,s.sid,s.serial# 
FROM v$locked_object l,dba_objects o,v$session s 
WHERE l.object_id=o.object_id 
AND l.session_id=s.sid 
ORDER BY o.object_id,xidusn DESC 


引用楼主 linzhangs 的帖子:
现在有两台服务器一台是150,一台是144
昨天用150服务器上的plsql登录144的数据库并执行导入操作aa_distancehost_log,tmp_aa_distancehost_log均在144服务器上。
insert into tmp_aa_distancehost_log(log_datetime索引已建)
select *
from aa_distancehost_log t
where t.log_datetime between
to_date('2008-10-01 00:00:00 ', 'yyyy-mm-dd hh24:mi:ss') and
to_date('2008-10-31 00…

------解决方案--------------------
我知道的就是从v$session_wait查在等待哪些事件,然后再做分析处理

150的机器上s1开始执行sql, 开另一个s2查看s1的等待事件,看看在等待些什么

------解决方案--------------------
都是高手~~
冒昧的插一句~~索引多了插入也会很慢~~
------解决方案--------------------
关注一下

------解决方案--------------------
进来只管接分
------解决方案--------------------
什么版本的,shared_pool_size 才 16M? 

------解决方案--------------------
lz,建议你建立一个新表,索引外键主键,所有的约束都不要建立,然后执行脚本,看看用多少时间?
脚本:
create table tmp_aa_distancehost_log_temp as 
select * 
from aa_distancehost_log t 
where t.log_datetime between 
to_date('2008-10-01 00:00:00 ', 'yyyy-mm-dd hh24:mi:ss') and 
to_date('2008-10-31 00:00:00', 'yyyy-mm-dd hh24:mi:ss'); 
commit;