网站首页 > 技术文章 正文
概述
因为最近在做存储过程优化,碰到一个update语句的问题,有大佬建议用批量绑定的方式来做优化,所以研究了下这块,并简单做了个实验。
批量绑定
通常在SQL语句中给PL/SQL变量赋值叫做绑定(Binding),一次绑定一个完整的集合称为批量绑定(Bulk Binding)。
批量绑定(Bulk Binding)通过一次绑定一个完整的集合,然后在PL/SQL块内部按照数组进行数据处理来加快SQL语句的效率。
通过两个DML语句:Bulk Collect和ForAll来实现。
Bulk Collect—用来提高查询(select)的性能
ForAll—用来提高(Insert,Delete,Update)的性能。
批量绑定(Bulk binds)包括:
(i) Input collections, use the FORALL statement,一般用来改善DML(INSERT、UPDATE和DELETE) 操作的性能
(ii) Output collections, use BULK COLLECT clause,一般用来提高查询(SELECT)的性能
FORALL的语法如下:
FORALL index IN lower_bound..upper_bound sql_statement;
简单测试,用以说明FORALL与FOR循环的性能差异:
1、创建测试表
set linesize 1000; set serveroutput on; drop table blktest; CREATE TABLE blktest (num NUMBER(20), name varchar2(50));
2、创建存储过程
CREATE OR REPLACE PROCEDURE bulktest IS TYPE numtab IS TABLE OF NUMBER (20) INDEX BY BINARY_INTEGER; TYPE nametab IS TABLE OF VARCHAR2 (50) INDEX BY BINARY_INTEGER; pnums numtab; pnames nametab; t1 NUMBER; t2 NUMBER; t3 NUMBER; BEGIN FOR j IN 1 .. 1000000 LOOP pnums (j) := j; pnames (j) := 'Seq No. ' || TO_CHAR (j); END LOOP; SELECT DBMS_UTILITY.get_time INTO t1 FROM DUAL; FOR i IN 1 .. 1000000 LOOP INSERT INTO blktest VALUES (pnums (i), pnames (i)); END LOOP; SELECT DBMS_UTILITY.get_time INTO t2 FROM DUAL; FORALL i IN 1 .. 1000000 INSERT INTO blktest VALUES (pnums (i), pnames (i)); SELECT DBMS_UTILITY.get_time INTO t3 FROM DUAL; DBMS_OUTPUT.put_line ('Execution Time (hsecs)'); DBMS_OUTPUT.put_line ('---------------------'); DBMS_OUTPUT.put_line ('FOR loop: ' || TO_CHAR (t2 - t1)); DBMS_OUTPUT.put_line ('FORALL: ' || TO_CHAR (t3 - t2)); END; /
3、执行存储过程
exec bulktest;
可以看到forall比for loop循环要快很多。
上面主要是通过实验来介绍下forall批量绑定,大家有空可以测试下,后面会分享批量绑定的一些改写例子,感兴趣的朋友可以关注下!
- 上一篇: 【服务器数据恢复】服务器硬盘坏道掉线怎么恢复数据?
- 下一篇: 数据堡垒:Oracle云中的加密与主权
猜你喜欢
- 2025-07-28 JDK高版本特性总结与ZGC实践(jdk高版本兼容低版本吗)
- 2025-07-28 分布式事务解决方案之2PC(两阶段提交)
- 2025-07-28 Oracle 赢得云大单:一年 2100 亿元
- 2025-07-28 Innodb中的事务隔离级别和锁的关系
- 2025-07-28 服务器密码错误被锁定怎么解决(服务器密码忘了怎么解除)
- 2025-07-28 2分钟,快速认识什么是SQL(什么是sql?)
- 2025-07-28 哪些百分百会问的MySQ面试题(面试mysql问题)
- 2025-07-28 在实际操作过程中如何避免出现SQL注入漏洞
- 2025-07-28 软件项目中的数据库设计规范模板(软件项目中的数据库设计规范模板有哪些)
- 2025-07-28 使用DDL创建数据库&数据表时需要注意什么?
你 发表评论:
欢迎- 636℃几个Oracle空值处理函数 oracle处理null值的函数
- 629℃Oracle分析函数之Lag和Lead()使用
- 617℃0497-如何将Kerberos的CDH6.1从Oracle JDK 1.8迁移至OpenJDK 1.8
- 613℃Oracle数据库的单、多行函数 oracle执行多个sql语句
- 611℃Oracle 12c PDB迁移(一) oracle迁移到oceanbase
- 603℃【数据统计分析】详解Oracle分组函数之CUBE
- 590℃最佳实践 | 提效 47 倍,制造业生产 Oracle 迁移替换
- 576℃Oracle有哪些常见的函数? oracle中常用的函数
- 最近发表
- 标签列表
-
- 前端设计模式 (75)
- 前端性能优化 (51)
- 前端模板 (66)
- 前端跨域 (52)
- 前端缓存 (63)
- 前端aes加密 (58)
- 前端脚手架 (56)
- 前端md5加密 (54)
- 前端路由 (61)
- 前端数组 (73)
- 前端js面试题 (50)
- 前端定时器 (59)
- 前端获取当前时间 (50)
- Oracle RAC (76)
- oracle恢复 (77)
- oracle 删除表 (52)
- oracle 用户名 (80)
- oracle 工具 (55)
- oracle 内存 (55)
- oracle 导出表 (62)
- oracle约束 (54)
- oracle 中文 (51)
- oracle链接 (54)
- oracle的函数 (58)
- 前端调试 (52)
本文暂时没有评论,来添加一个吧(●'◡'●)