向数据库中插入大批量的数据时,由于资源的限制,可能无法实时地监控语句运行。以下是我的一些看法和经验。
执行insert append操作前,尽量将所有的约束暂时禁用或清除,索引删除(待插入后重建)。这样可以极大地改善插入的效率。
在插入过程中,我们可能希望看到数据插入的进度。这时,如果使用了索引,可以通过查看索引的nextval值来获取插入进度。
数据插入结束后,为了保证后续操作的正常,应该启用(enable)主键约束。因为在进行统计量收集、update操作之前都会首先进行一个select count(1)的操作。若事务比较大,该过程通
过v$session和v$sql的关联可以看到。
大批量插入数据前,适当增大redo log日志文件的大小,保证其切换频率在10~15分钟左右;若使用了序列,将序列的cache值调整的稍大一些。
进行update操作,索引的影响更加强烈。应该坚决删除不必要的索引,以防止update过程中对索引的维护成本和索引的叶子块分裂造成的空间膨胀。
对上千万数据的表按照另外一张表进行update,且表上没有分区,可以暂时创建分区索引来提高性能。如果可以按照某一列进行分批操作,可以创建全局的分区索引;如果任何一列都不能使
操作的内容分批,可以尝试使用hash分区索引。
从依赖表中每次fetch1000~10万数据(根据机器性能等因素)到游标中,用forall语句进行update。
==============================================================================================================
数据处理的同时,对正在操作的表再进行跟踪查询操作可能使性能受到很大影响。我们可以借助数据字典表来监控进度、保证性能。
将下面语句的XXXX替换为当前用户,可以看到当前用户都在进行着哪些操作。
select * from v$sql where sql_id in (select sql_id from v$session where status='ACTIVE' and username='XXXX');
根据从上面语句中获得的sql_text,可以知道存储过程执行到哪个语句了;而通过sql_id,可以用以下语句看到执行计划:
select * from table(dbms_xplan.display_cursor('sql_id的值',0));
比如,有如下代码段:
open b_trans;
loop
fetch b_trans bulk collect into lis_trans_seq,lis_bill_period,lis_sales_nm
limit 8000;
v_count:=lis_trans_seq.count;
forall i in lis_sales_nm.first..lis_sales_nm.last
update BILL_P set trans_seq=lis_trans_seq(i)
where sales_nm=lis_sales_nm(i)
and bill_period=lis_bill_period(i);
commit;
exit when v_count=0;
end loop;
close bsdtrans;
作用是将BILL_P表中的trans_Seq按照sales_nm、bill_period进行update。每次从游标b_trans中获取八千条数据进行批量更新,直到全部更新为止。
通过v$sql,我们可以看到update语句的执行次数,进而得到更新的进度。
执行:select executions from v$sql where sql_text='UPDATE BILL_P SET TRANS_SEQ=:B1 WHERE SALES_NM=:B3 AND BILL_PERIOD=:B2 '
得到的执行次数为113次,而每次fetch的数量是8000,则已经更新的数量就是8000*113(前提是以前没有执行过此语句)。然而,这种方式并不准确,只可以作为我们监控的一个参考。
实际操作中发现,查询显示某个sql执行了40多次,而根据40*8000的方式计算,早已经超过了表中数据量,但仍没有执行完成。根据ROWS_PROCESSED的结果似乎是正确的。
通常来说,查看累积的结果意义不大,查看两个时间点间统计量的差值更有意义。
比如查看每隔十分钟查看该语句的执行次数,由差值计算出来的结果是比较准确的。
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/26451536/viewspace-756674/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/26451536/viewspace-756674/