在线等分析,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;
------解决方案--------------------
这个语句将查找到数据库中所有的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
------解决方案-------------------- 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;