当前位置:  数据库>oracle

Oracle 10g大表批量更新优化

    来源: 互联网  发布时间:2017-05-07

    本文导语: Oracle 10g大表批量更新优化,其实,700万的表不算大表,作为测试够了 一,t表信息SQL> alter table t add is_del number(1);SQL> alter table t modify is_del default 0; SQL> desc tName   Type      Nullable Default Comments------ --------- -------- ------- --------ID  ...

Oracle 10g大表批量更新优化,其实,700万的表不算大表,作为测试够了

一,t表信息
SQL> alter table t add is_del number(1);
SQL> alter table t modify is_del default 0;

SQL> desc t
Name   Type      Nullable Default Comments
------ --------- -------- ------- --------
ID     NUMBER    Y                       
CODE   NUMBER    Y                       
IS_DEL NUMBER(1) Y        0




SQL> select count(*) from t;
 
  COUNT(*)
----------
  7136976



二,为了比较基准的一致性,先缓存t数据
update t set t.is_del = 0;

三,这里共总结了4种方法
SQL> set timing on
--0
SQL> update t set t.is_del = 0;


7136976 rows updated.

Elapsed: 00:08:28.64

--1
SQL> declare
  2    rnt pls_integer := 0;
  3  begin
  4    for idx in (select rowid rid from t) loop
  5      update t set t.is_del = 0 where rowid = idx.rid;
  6      rnt := rnt + 1;
  7      if mod(rnt,2000) = 0 then
  8        commit;
  9      end if;
 10    end loop;
 11    commit;
 12  end;
 13  /











PL/SQL procedure successfully completed.

Elapsed: 00:09:41.32
SQL>

--2
SQL> declare
  2    rnt pls_integer := 0;
  3  begin
  4    for idx in (select rowid rid from t) loop
  5      update t set t.is_del = 0 where rowid = idx.rid;
  6      rnt := rnt + 1;
  7      if rnt = 2000 then
  8        rnt := 0;
  9        commit;
 10      end if;
 11    end loop;
 12    commit;
 13  end;
 14  /













PL/SQL procedure successfully completed.

Elapsed: 00:09:35.67

--3
SQL> declare
  2    cursor cur_t is select rowid rid from t;
  3    type tab_t is table of urowid index by binary_integer;
  4    l_rid tab_t;
  5  begin
  6    open cur_t;
  7    loop
  8      fetch cur_t bulk collect into l_rid limit 2000;
  9      forall idx in 1 .. l_rid.count
 10        update t set t.is_del = 0 where rowid = l_rid(idx);
 11      commit;
 12      exit when cur_t%notfound;
 13    end loop;
 14    close cur_t;
 15  end;
 16  /















PL/SQL procedure successfully completed.

Elapsed: 00:06:48.84

通过上面的测试结果可以看到,方法3最好,方法0不建议使用,这会使undo快速增长,出现ora-01555错误。方法1和方法2在一些书籍上看到过测试,说方法2优于方法1,但我这次测试效果不明显,以后再进行一些测试。

注:
测试的数据库配置了闪回特性,db_recovery_file_dest_size=2g,归档日志放在db_recovery_file_dest目录中。开始时的更新操作,redo增长很快,常常hang住了,alert log报空间不足,所有增加了db_recovery_file_dest_size=4g。还有要注意undo表空间的监控。


    
 
 

您可能感兴趣的文章:

  • 国内哪里可以下载oracle8.1.7或更新版本
  • Oracle 2010年4月更新修复Oracle协作套件安全漏洞
  • Oracle 2010年7月更新修复Oracle Fusion中间件安全漏洞
  • oracle更新xml节点问题的一些细节
  • Oracle 2010年7月更新修复多个Oracle Database安全漏洞
  • Oracle 2010年7月更新修复Transportation Manager安全漏洞
  • Oracle 2010年7月更新修复Enterprise Manager Grid Control安全漏洞
  • jsp如何选择更新oracle的date字段
  • Oracle 2010年7月更新修复多个PeopleSoft安全漏洞
  • Oracle 2010年7月更新修复多个E-Business Suite安全漏洞
  • Oracle 2010年4月更新修复多个E-Business Suite安全漏洞
  • Oracle多表级联更新详解
  • ORACLE学习笔记-添加更新数据函数篇
  • 如何用不算很熟练的jsp,oracle,javascript,html,css等建设动态网站,要网页打开速度快、易于日常维护更新?
  • 利用可更新ResultSet的updateBinaryStream()可以把图片存到mySql数据库,却不能存到Oracle数据库,怎么办?
  • 批量更新关联表(oracle、sql server)
  • 为什么我用javabean更新不了数据库?javabean,oracle高手请进!!!!!高分相赠!!!在线等待中。。。
  • Oracle 10g和Oracle 11g网格技术介绍
  • 虚拟机装Oracle R12与Oracle10g
  • Oracle 10g中导出到Oracle 9的问题小结
  • 安装Oracle 10g忘记sys密码
  • Oracle 10G进程体系学习笔记
  • 移动开发 iis7站长之家
  • SOLARIS 下如何卸载ORACLE10G
  • oracle10g 数据备份与导入
  • 为何用dbstart启动oracle10g不好用
  • linux下oracle 10g如何完全卸载?
  • Oracle 10g client for Solaris
  • 急求Linux下oracle 10g和weblogic 9的安装
  • Linux系统下利用java连接Oracle 10G
  • Linux下完全卸载ORACLE 10G的方法
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • Oracle 12c发布简单介绍及官方下载地址
  • 在linux下安装oracle,如何设置让oracle自动启动!也就是让oracle那个服务自动启动,不是手动的
  • oracle 11g最新版官方下载地址
  • 请问su oracle 和su - oracle有什么不同?
  • Oracle 数据库(oracle Database)Select 多表关联查询方式
  • Oracle 数据库开发工具 Oracle SQL Developer
  • Oracle数据库(Oracle Database)体系结构及基本组成介绍
  • Oracle EBS R12 支持 Oracle Database 11g
  • 如何设置让Oracle SQL Developer显示的时间包含时分秒
  • SCO unix下安装oracle,但没有光盘,请大家推荐一个oracle下载站点(unix版本的)。谢谢!!!!
  • oracle中如何把表中具有相同值列的多行数据合并成一行
  • 请问大家用oracle数据库, 用import oracle.*;下的东西么? 还是用标准库?
  • Oracle 数据库(oracle Database)性能调优技术详解
  • Linux /$ORACLE_HOME $ORACLE_HOME
  • ORACLE日期相关操作
  • Linux系统下Oracle的启动与Oracle监听的启动
  • ORACLE数据库常用字段数据类型介绍
  • 请问在solaris下安装ORACLE,用root用户和用oracle用户安装有什么区别么?
  • Oracle 12c的九大最新技术特性介绍
  • 网间Oracle的连接,远程连接Oracle服务器??
  • ORACLE中DBMS_RANDOM随机数生成包
  • 请教:.profile中:if [ -d /opt/oracle/db01/app/oracle/product/9.2.0 ]是什么意思?


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,