近日,接触到ORACLE 存储过程的优化问题,业务过程非常简单。该存储过程的主要DML操作就是UPDATE,需要根据某个条件对数据表的某个字段进行更新,其中使用到游标。之后写了个测试的例子,以下具体介绍。 测试环境: OS:WINDOWS XP +Intel(R) 2CPU(1.60GHz) + 1GB 数据库: ORACLE10g 测试数据:10万行 存储过程代码: CREATE OR REPLACE PROCEDURE prc_update_0 IS TYPE tab_id IS TABL……
我们一直都在努力坚持原创.......请不要一声不吭,就悄悄拿走。
我原创,你原创,我们的内容世界才会更加精彩!
【所有原创内容版权均属TechTarget,欢迎大家转发分享。但未经授权,严禁任何媒体(平面媒体、网络媒体、自媒体等)以及微信公众号复制、转载、摘编或以其他方式进行使用。】
微信公众号
TechTarget
官方微博
TechTarget中国
近日,接触到ORACLE 存储过程的优化问题,业务过程非常简单。该存储过程的主要DML操作就是UPDATE,需要根据某个条件对数据表的某个字段进行更新,其中使用到游标。之后写了个测试的例子,以下具体介绍。
测试环境:
OS:WINDOWS XP +Intel(R) 2CPU(1.60GHz) + 1GB
数据库: ORACLE10g
测试数据:10万行
存储过程代码:
CREATE OR REPLACE PROCEDURE prc_update_0 IS TYPE tab_id IS TABLE OF ROWID; CURSOR cur_sky IS SELECT ROWID FROM TBL_USER_AUTH WHERE IMSI IS NOT NULL; BEGIN OPEN cur_sky ; FETCH cur_sky BULK COLLECT INTO v_rowid ; FORALL i IN 1..v_rowid.COUNT UPDATE TBL_USER_AUTH SET MPXYZDATAE='nsofsofmslfd' WHERE ROWID = v_rowid(i); COMMIT; CLOSE cur_sky; EXCEPTION WHEN others THEN ROLLBACK; DBMS_OUTPUT.PUT_LINE('Update failed !'); END; / CREATE OR REPLACE PROCEDURE prc_update_1 IS v_rowid ROWID; CURSOR cur_sky IS SELECT ROWID FROM TBL_USER_AUTH WHERE IMSI IS NOT NULL; BEGIN OPEN cur_sky ; LOOP FETCH cur_sky INTO v_rowid ; EXIT WHEN cur_sky%NOTFOUND; UPDATE TBL_USER_AUTH SET MPXYZDATAE='nsofsofmslfd' WHERE ROWID = v_rowid; END LOOP; COMMIT; CLOSE cur_sky; EXCEPTION WHEN others THEN ROLLBACK; DBMS_OUTPUT.PUT_LINE('Update failed !'); END; / |
运行次数
时间(s) 1 2 3 4 5 6 7 8 9 10 avg
prc_update_0 5 4 4 7 4 4 8 8 4 8 5.6
prc_update_1 9 11 9 10 13 9 9 9 11 9 9.9
从以上结果可以看出:
对于游标的循环,BULK COLLECT对性能的改善有很大的提高。实验数据只有10万行,当数据量达到千万级的时候,运行时间的差距就非常明显。
作者
相关推荐
-
Azure数据湖分析从U-SQL中获得提升
大数据的发展已经让许多精通SQL的数据专业人员不知所措。微软的U-SQL编程语言试图让这些人回归数据查询游戏。
-
TT百科:SQL(结构化查询语言)
一般来说,SQL-on-Hadoop仍是一项新兴技术,但随着各个公司寻求获得拥有大数据应用程序编程SQL技能的开发和分析人员,它们正逐渐成为Hadoop部署的固定组件。
-
SQL和NoSQL数据库设计之争
企业收集了很多大规模增长的松散结构化数据,Hadoop,Spark以及其他新技术处理这些数据非常有助于改善商业智能分析效率。
-
如何通过格式良好的SQL提高效率和准确性
格式良好的SQL并不会比乱七八糟的SQL运行效果更好。数据库其实不怎么关心SQL语句中你把逗号放到了字段名的前面还是后面。