direct path read temp等待时间和利用DDL删除重复数据
Nov012011
今天在删除重复数据的时候,数据库特别的慢,CPU和内存消耗还不是很多。
SQL> delete from test t where (t.doc,t.vol,t.efile)in (select doc,vol,efile from test group by doc,vol,efile having count(*)>1) and rowid not in(select min(rowid) from test group by doc,vol,efile having count(*)>1);
经查询,数据库里一直存在direct path read temp等待事件。
SQL> select EVENT,WAIT_CLASS from v$session_wait where WAIT_CLASS!='Idle'; EVENT WAIT_CLASS ------------------------- -------------------- direct path read temp User I/O
这个等待事件是当一个SESSION直接读取数据到PGA中,由于服务器处理PGA中数据块的速度远大于从磁盘读数据块到PGA的速度,通常解决这个问题的方法都是增大PGA的大小。由于系统资源有限,将pga_aggregate_target增大到1G,direct path read temp等待时间还是很明显,通过查看delete语句的执行计划,这个SQL需要执行3次全表扫描,test表280M,而且会产生笛卡尔集,后来利用以下方法实现快速去除重复数据。
SQL> create table ttt as select distinct * from test; SQL> drop table test purge; SQL> alter table ttt rename to test;