Oracle-利用-rowid-提升-update-性能.docVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
Oracle-利用-rowid-提升-update-性能

Oracle-利用-rowid-提升-update-性能 Oracle 利用 rowid 提升 update 性能Oracle 利用 rowid 提升 update 性能 关于ROWID的介绍参考我的Blog: Oracle Rowid 介绍 /tianlesoftware/archive/2009/12/16/5020718.aspx 关于大表Update 的一个讨论,参考itpub: /viewthread.php?tid=1052077 一. 在虚拟机上 使用rowid 进行update 测试 使用rowid 进行update能提高速度,是因为通过rowid 能够迅速的进行定位,不用全表进行扫描。 -- 查看表dave 记录数 SYS@dave2(db2)gt; select count(*) from dave; COUNT(*) ---------- 3080115 --300万数据 -- 创建测试表dba SYS@dave2(db2)gt; create table dba as select * from dave; Table created. --用dave 表去更新DBA表 SYS@dave2(db2)gt; update dba ta set prov_code=(select area_code from dave tb where ta.id=tb.id); 3080115 rows updated. Elapsed: 00:16:12.81 -- 整个更新花了16分钟 --update 期间查看session 执行时间: SQLgt;select sid,target,time_remaining,elapsed_seconds,message,sql_id from v$session_longops where sid=138; select * from v$lock where sid=138; select * from v$session_wait where sid=138; -- 使用rowid 进行更新 DECLARE CURSOR cur IS SELECT a.area_code, b.ROWID ROW_ID FROM dave a, dba b WHERE a.id = b.id ORDER BY b.ROWID; ---如果表的数据量不是很大,可以不用 order by rowid V_COUNTER NUMBER; BEGIN V_COUNTER := 0; FOR row IN cur LOOP UPDATE dba SET prov_code = row.area_code WHERE ROWID = row.ROW_ID; V_COUNTER := V_COUNTER + 1; IF (V_COUNTER gt;= 1000) THEN COMMIT; V_COUNTER := 0; END IF; END LOOP; COMMIT; END; PL/SQL procedure successfully completed. Elapsed: 00:14:54.07 -- 执行花了14分钟,速度提高不是很多。 在这个更新中,使用了ORDER BY b.ROWID 进行了排序,每个数据块里面都有多条记录,这样按rowid 进行排序,那么这样每次访问数据块的时候就会相同,就会减小block 在调用的次数,从而提高效率。 因为我这是虚拟机上的测试环境,所以内存分配的并不合适,I/O 也不行。 --我们把order by 去掉,在更新看看 DECLARE CURSOR cur IS SELECT a.area_code, b.ROWID ROW_ID FROM dave a, dba b WHERE a.id = b.id; V_COUNTER NUMBER; BEGIN V_COUNTER := 0; FOR row IN cur LOOP UPDATE dba SET prov_code = row.area_code WHERE ROWID = row.ROW_ID; V_COUNTER := V_COUNTER + 1; IF (V_COUNTER gt;= 1000) THEN COMMIT; V_COUNTER := 0; END IF; END LOOP; COMMIT; END; PL/SQL procedure successfully completed. Elapsed: 00:20:24.43 -- 居然用了21分钟,看来对大表

文档评论(0)

f8r9t5c + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

版权声明书
用户编号:8000054077000003

1亿VIP精品文档

相关文档