`
winie
  • 浏览: 216968 次
  • 性别: Icon_minigender_1
  • 来自: 重庆
社区版块
存档分类
最新评论

动态SQL、绑定变量、静态SQL的性能对比

阅读更多

测试样例

下面的三个存储过程,分别使用了动态SQL、绑定变量、静态SQL三种编程方式。具体存储过程内容如下:

l动态SQL

create or replace procedure proc1 as

begin

for i in 1 .. 100000 loop

execute immediate 'insertinto t values (' || i || ')';

commit;

end loop;

end proc1;

l绑定变量

create or replace procedure proc2 as

begin

for i in 1 .. 100000 loop execute immediate 'insert into t values(:X)' using i; commit;

end loop;

end proc2;

l静态SQL

create or replace procedure proc3 as

begin

for i in 1 .. 100000 loop

insert into t values(i); commit;

end loop;

end proc3;

2 测试过程

测试过程的步骤为

1) drop table t purge;

2) create table t (x int);

3) alter system flush shared_pool;

4) set timing on

5) exec procxxx;

6) select count(*) from t;

在上述的测试过程中,由于每次测试时的表全是新的,并刷新了共享池,所以每次的测试效果还是比较正确的。此次测试是在物理机上进行的测试,而非虚拟机上进行测试。

3 测试结果3.1动态SQL

Proc1存储过程使用了动态SQL,这样就会在每次执行insert语句时,要对每一个insert语句进行硬解析,这样就增加了共享池的硬解析开销,下面是v$sql视图中的结果

SQL_TEXT EXECUTIONS PARSE_CALLS

------------------------------------------------------------ -----------

BEGINproc1; END; 1 1

insertinto t values (99280) 1 1

insertinto t values (99310) 1 1

insertinto t values (99362) 1 1

insertinto t values (99377) 1 1

insertinto t values (99399) 1 1

insertinto t values (99474) 1 1

insertinto t values (99544) 1 1

insertinto t values (99592) 1 1

insertinto t values (99601) 1 1

insertinto t values (99634) 1 1

insertinto t values (99696) 1 1

insertinto t values (99746) 1 1

insertinto t values (99804) 1 1

insertinto t values (99807) 1 1

insertinto t values (99859) 1 1

insertinto t values (99861) 1 1

insertinto t values (99930) 1 1

insertinto t values (99936) 1 1

insertinto t values (99956) 1 1

proc1存储过程,在本次测试中使用了24.25秒,具体结果如下

SQL> exec proc1;

PL/SQL procedure successfully completed.

Elapsed: 00:00:24.25

3.2绑定变量

Proc2存储过程使用了绑定变量,这样在执行过程上,就会减少硬解析的开销,降低共享池的争用。在执行过程中,v$sql视图中的结果如下

SQL_TEXT EXECUTIONS PARSE_CALLS

------------------------------------------------------------ -----------

BEGIN proc2;END; 1 1

insert intot values (:X) 100000 0

insert语句并没有解析1次执行1次,而是解析了1次,执行了10万次。Proc2存储过程,在本次测试中使用了20.94秒,执行结果如下

SQL>exec proc2;

PL/SQL proceduresuccessfully completed.

Elapsed:00:00:20.94


3.3静态SQL

Proc3存储过程使用了静态SQL,这样在编译过程中insert语句就解析好了,而不像proc2存储过程需要在执行过程中再解析,这样节省了一些时间,具体的测试结果如下

SQL_TEXT EXECUTIONS PARSE_CALLS

------------------------------------------------------------ -----------

BEGINproc3; END; 1 1

INSERTINTO T VALUES(:B1 ) 100000 0

在静态SQL中,insert语句也是使用了绑定变量,所以也是解析1次,然后多次执行。Proc3存储过程执行了17.82秒,具体结果如下

SQL>exec proc3;

PL/SQL proceduresuccessfully completed.

Elapsed:00:00:17.82


4 测试总结

动态SQL适用于表名及查询字段名未知的情况。在已知查询字段名及表名的情况下,使用动态SQL(字符串拼接方式)会增加硬解析的开销,在这种情况下,建议使用静态SQL,这样可以提高执行效率。在过程过程用拼凑的动态sql效率并不高,有时候还不如程序直接传递sql.静态SQL是前置编译绑定,动态SQL是后期执行时才编译绑定

参考:

<Oracle专家高级编程>

分享到:
评论

相关推荐

    SQL 优化原则

    ORACLE在内部执行了许多工作: 解析SQL语句, 估算索引的利用率, 绑定变量 , 读数据块等; (5) 在SQL*Plus , SQL*Forms和Pro*C中重新设置ARRAYSIZE参数, 可以增加每次数据库访问的检索数据量 ,建议值为200 (6) ...

    高性能MySQL(第3版).part2

    7.6.2SQL接口的绑定变量286 7.6.3绑定变量的限制288 7.7用户自定义函数289 7.8插件290 7.9字符集和校对291 7.9.1MySQL如何使用字符集292 7.9.2选择字符集和校对规则295 7.9.3字符集和校对规则如何影响查询296...

    支持多数据库的ORM框架ef-orm.zip

    (E-SQL) E-SQL不但解决了异构数据库的语法问题、函数问题、特殊的写法问题,还解决了动态SQL问题、绑定变量扩展等特性。 对于各种常用SQL函数和运算符,都可以自动转换为当前数据库支持的方言来操作。其函数支持也要...

    C#开发经验技巧宝典

    0907 SQL Server实现静态交叉表 529 0908 SQL Server实现动态交叉表 531 19.9 常用数据操作 532 0909 如何对字符串进行查询 532 0910 如何进行单条数据的添加 533 0911 如何进行批量数据的添加 533 0912...

    【最新仿59store校园o2o系统 v6.8】夜猫店+校园超市+学生街+微信公众号绑定+校园跑腿插件,完整版源码下载

    6.微信公众号绑定 7.支持微信支付和支付宝 8.商家特卖频道 9.商家优惠券 安装说明: 直接输入程序目录即可 http://localhost/ 程序只支持站点根目录 安装问题说明: 1.跳转不到安装目录:删除config/install.lock 2...

    【仿59store校园o2o系统 v6.8】夜猫店+校园超市+学生街+微信公众号绑定+校园跑腿插件

    【仿59store校园o2o系统 v6.8】夜猫店+校园超市+学生街+微信公众号绑定+校园跑腿插件 仿59store校园o2o系统是一个以php+MySQL进行开发的主要针对校园市场开发的O2O系统。 1.夜猫店:校园每栋楼可以开设一个夜猫店 2....

    php网络开发完全手册

    2.2.4 动态变量 29 2.3 运算符和关键字 29 2.4 流程控制语法 30 2.4.1 程序控制语句的简介 30 2.4.2 条件控制语句 30 2.4.3 循环控制语句 33 2.4.4 转移控制语句 35 2.5 表达式 36 2.5.1 简单的表达式例子 36 2.5.2 ...

    仿59store校园o2o系统 v2.71

    6.微信公众号绑定 7.支持微信支付和支付宝 8.商家特卖频道 9.商家优惠券 安装说明: 直接输入程序目录即可 http://localhost/ 程序只支持站点根目录 安装问题说明: 1.跳转不到安装目录:删除config/install.lock 2....

    仿59store校园o2o系统 v2.42校园o2o系统 得推校园O2O系统 仿59store

    6.微信公众号绑定 7.支持微信支付和支付宝 8.商家特卖频道 9.商家优惠券 安装说明: 直接输入程序目录即可 http://localhost/ 程序只支持站点根目录 安装问题说明: 1.跳转不到安装目录:删除config/install.lock 2....

    java初学者必看

    9.4 静态绑定与动态绑定 9.4.1 静态绑定 9.4.2 动态绑定 9.5 抽象类 9.5.1 抽象类概念 9.5.2 抽象类应用 9.5.3 抽象类注意事项 9.6 本章习题 第10章 接口与内部类 10.1 接口 10.1.1 接口的概念 10.1.2 ...

    C#.net_经典编程例子400个

    第1章 窗体与界面设计 1 1.1 菜单应用实例 2 实例001 带历史信息的菜单 2 实例002 菜单动态合并 3 实例003 像开始菜单一样漂亮的菜单 4 实例004 任务栏托盘菜单 5 实例005 可以拉伸...

    C#程序开发范例宝典(第2版).part13

    实例230 文件比较 318 实例231 获取文件夹中的图标资源 319 实例232 获取文件夹下的所有文件夹及文件的名称 321 第7章 操作系统与Windows相关程序 324 7.1 启动相关 325 实例233 进入Windows系统前发出警告 ...

Global site tag (gtag.js) - Google Analytics