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