设为首页 收藏本站
查看: 1716|回复: 0

[经验分享] 动态SQL和静态SQL及绑定变量性能对比

[复制链接]

尚未签到

发表于 2018-10-24 10:26:27 | 显示全部楼层 |阅读模式
  动态SQL和静态SQL及绑定变量性能对比
  1、测试样例
  下面的三个存储过程,分别使用了动态SQL、绑定变量、静态SQL三种编程方式。具体存储过程内容如下:
  l)动态SQL
create or replace procedure proc1 as  
begin
  
  for i in 1 .. 100000 loop
  
    execute immediate 'insert into t values (' || i || ')';
  
    commit;
  
  end loop;
  
end proc1;
  
  执行proc1后:
  Proc1存储过程使用了动态SQL,这样就会在每次执行insert语句时,要对每一个insert语句进行硬解析,这样就增加了共享池的硬解析开销,下面是v$sqlarea视图中的结果
19:23:20 SYS@ prod> select sql_text ,PARSE_CALLS ,EXECUTIONS  from v$sqlarea  
  where sql_text like 'insert into t%';
  
  SQL_TEXT                                           PARSE_CALLS EXECUTIONS
  -------------------------------------------------- ----------- ----------
  insert into t values (56386)                                 1          1
  insert into t values (58271)                                 1          1
  insert into t values (57503)                                 1          1
  insert into t values (58762)                                 1          1
  insert into t values (58158)                                 1          1
  insert into t values (57081)                                 1          1
  insert into t values (57574)                                 1          1
  insert into t values (56146)                                 1          1
  insert into t values (58674)                                 1          1
  insert into t values (56186)                                 1          1
  insert into t values (56548)                                 1          1
  insert into t values (57817)                                 1          1
  insert into t values (56534)                                 1          1
  insert into t values (56678)                                 1          1
  insert into t values (56758)                                 1          1
  insert into t values (57501)                                 1          1
  insert into t values (56959)                                 1          1
  
  2)绑定变量
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;
  
  执行proc2:
  Proc2存储过程使用了绑定变量,这样在执行过程上,就会减少硬解析的开销,降低共享池的争用。在执行过程中,v$sqlarea视图中的结果如下
19:29:21 SYS@ prod>select sql_text ,PARSE_CALLS ,EXECUTIONS  from v$sqlarea  
where sql_text like 'insert into t%';
  
  SQL_TEXT                                           PARSE_CALLS EXECUTIONS
  -------------------------------------------------- ----------- ----------
  insert into t values(:X)                                     1     100000
  Elapsed: 00:00:00.08
  insert语句并没有解析1次执行1次,而是解析了1次,执行了10万次。
  3)静态SQL
create or replace procedure proc3 as  
begin
  
for i in 1 .. 100000 loop
  
insert into t values(i);
  
end loop;
  
end proc3;
  
  执行proc3:
  Proc3存储过程使用了静态SQL,这样在编译过程中insert语句就解析好了,而不像proc2存储过程需要在执行过程中再解析,这样节省了一些时间,具体的测试结果如下
19:40:46 SYS@ prod>select sql_text ,PARSE_CALLS ,EXECUTIONS  from v$sqlarea  
19:40:59   2  where sql_text like 'INSERT INTO T%';:
  
  SQL_TEXT                                           PARSE_CALLS EXECUTIONS
  -------------------------------------------------- ----------- ----------
  INSERT INTO T VALUES(:B1 )                                   0     100000
  Elapsed: 00:00:00.05
  在静态SQL中,insert语句也是使用了绑定变量,所以也是解析1次,然后多次执行。
  2、测试总结
  动态SQL适用于表名及查询字段名未知的情况。在已知查询字段名及表名的情况下,使用动态SQL(字符串拼接方式)会增加硬解析的开销,在这种情况下,建议使用静态SQL,这样可以提高执行效率。在存储过程用拼凑的动态sql效率并不高,有时候还不如程序直接传递sql.静态SQL是前置编译绑定,动态SQL是后期执行时才编译绑定。



运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-625811-1-1.html 上篇帖子: java 防止sql注入的简单方法 下篇帖子: 关于hibernateTemplate的使用SQL执行查询
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表