频道栏目
读书频道 > 数据库 > Oracle > 收获,不止Oracle
2.3.2.3 静态改写,汽车速度
2013-04-17 09:10:50     我来说两句
收藏   我要投稿

本文所属图书 > 收获,不止Oracle

在这本书里读者将会跟随作者一同对Oracle数据库的相关知识进行梳理,最终共同提炼出必须最先掌握的那部分知识,无论你是数据库开发、管理、优化、设计人员,还是从事Java、C的开发人员。接下来作者再将这部分知识...  立即去当当网订购

“大家还想不想再快一点?”梁老师这次开口吓了大家一跳。

“梁老师您太贪心了吧!”晶晶打趣地说道,看来课堂上同学们还真是被梁老师带动得无拘无束了,什么话都敢说啊。

“其实真的是还能再快的,你们看看这两个过程,是否觉得哪里写得有点别扭?”梁老师提醒大家认真看proc1和proc2。

“梁老师,这个execute immediate和双引号是啥意思啊,为什么不直接写成insert into t values (i)啊?”刚才开玩笑的曾祥也提问了。

“不错!终于看出来了,execute immediate是一种动态SQL的写法,常用于表名字段名是变量、入参的情况,由于表名都不知道,所以当然不能直接写SQL语句了,所以要靠动态SQL语句根据传入的表名参数,来拼成一条SQL语句,由execute immediate调用执行。但是这里显然不需要多此一举,因为insert into t values (i)完全可以满足需求,表名就是t啊。

我们来改写成proc3,如下:
create or replace procedure proc3
as
begin
    for i in 1 .. 100000
    loop
     insert into t values (i);  
  commit;
    end loop;
end;
/
----这里要记得先预先执行一遍,将过程创建起来!

脚本2-35  第2次改进,将proc2改造成静态SQL的proc3

接下来我们继续测试proc3的性能,也是在公平的环境下操作的,如下:
SQL> drop table t purge;
表已删除。
SQL> create table t ( x int );
表已创建。
SQL> alter system flush shared_pool;
系统已更改。
SQL> set timing on
SQL> exec proc3;
PL/SQL 过程已成功完成。
已用时间:  00: 00: 06.25
SQL> select count(*) from t;
  COUNT(*)
------------------
    100000

脚本2-36  第2次改进后6秒完成,摩托变汽车

大家看看,现在是什么情况?” 梁老师笑着说。

“哇,又快了!”晶晶惊叫起来,引来了一片笑声。

“为什么会快了,我们分析分析,这个语句肯定有用到绑定变量,一般来说,静态SQL会自动使用绑定变量,我们来查看查看(如图2-28所示)。


 

果然如此,proc3也实现了绑定变量,而且动态SQL的特点是执行过程中再解析,而静态SQL的特点是编译的过程就解析好了。这点差别就是速度再度提升的原因。现在大家对这个速度满意了吧。”

台下纷纷点头。

您对本文章有什么意见或着疑问吗?请到论坛讨论您的关注和建议是我们前行的参考和动力  
上一篇:2.3.2.2 绑定变量,摩托速度
下一篇:2.3.2.4 批量提交,动车速度
相关文章
图文推荐
排行
热门
最新书评
特别推荐

关于我们 | 联系我们 | 广告服务 | 投资合作 | 版权申明 | 在线帮助 | 网站地图 | 作品发布 | Vip技术培训 | 举报中心

版权所有: 红黑联盟--致力于做实用的IT技术学习网站