数据库优化—ORACLE动态绑定变量

Oracle 将已解析、已编译的SQL 连同其他内容存储在共享池(shared pool)中,这是系统全局区(System Global Area ,SGA)中一个非常重要的共享内存结构。但是已解析,已编译的SQL要想实现其复用有一个前提,要求开发人员在大多数情况下都会使用绑定变量。
绑定变量(bind variable)是查询中的一个占位符。
例如比较如下SQL语句:
select * from table where id = 1与
my_id := 1
select * from table where id = my_id
对于第一个SQL语句,在查询中使用直接量(常量),那么每个查询都将是一个全新的查询,在数据库看来以前从未见过,必须对查询进行解析、限定(命名解析)、安全性检查、优化等。简单地讲,就是你执行的每条不同的语句都要在执行时进行编译。(解析包含有硬编码变量的语句称为硬解析)
而对于第二个查询使用了一个绑定变量my_id,变量值在查询执行时提供。这个查询只编译一次,随后会把查询计划存储在一个共享池(库缓存)中,以便以后获取和重用这个查询计划,(重用已解析的查询计划称为软解析)。
软解析与硬解析之间的区别主要表现在以下几个方面:
1、与软解析相比硬解析需要的时间更长,而且要消耗更多的资源,硬解析会减少系统能支持的用户数。
2、硬解析一个查询时,数据库会更长时间地占用一种低级串行化设备,这称为闩(latch),这些闩能保护Oracle共享内存中的数据结构不会同时被两个进程修改,而且如果有人正在修改数据结构,则不允许另外的人再来读取。对这些数据结构加闩的时间越长、越频繁,排队等待闩的进程就越多,等待队列也越长。你可能开始独占珍贵的资源。有时你的计算机显然利用不足,但是数据库中的所有应用都运行得非常慢。造成这种现象的原因可能是有人占据着某种串行化设备,而其他等待串行化设备的人开始排队,因此你无法全速运行。数据库中只要有一个应用表现不佳,就会严重地影响所有其他应用的性能。如果只有一个小应用没有使用绑定变量,那么即使其他应用原本设计得很好,能适当地将已解析的SQL放在共享池中以备重用,但因为这个小应用的存在,过一段时间就会从共享池中删除已存储的SQL。这就使得这些设计得当的应用也必须再次硬解析SQL。
代码实现实例:
1、oracle自己默认实现的绑定变量:
for i in 1..1000 loop
  select count(*) into my_count from table where my_type = i;
end loop;
在上面的情况,Oracle会自己绑定变量,即,如果参数保存在一个数组中,select语句放在一个循环中,select 语句只会编译一次。
2、动态绑定变量
my_type:='type1';
my_count := 0;
my_sql:='select count(*) into :x from table where type = :y'
Execute Immediate my_sql into my_count using my_type;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值