大批量数据处理操作小记

 


向数据库中插入大批量的数据时,由于资源的限制,可能无法实时地监控语句运行。以下是我的一些看法和经验。


执行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/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值