新博客http://www.cnblogs.com/zhjh256 欢迎访问
分类: Oracle
2008-01-06 21:42:15
使用绑定变量
为了理解榜定变量相对于性能的影响,必须首先知道在提交SQL到服务器进程后发生了什么?
首先服务器哈希SQL看是否在库缓存中,假设没有则执行如下过程。
下一步是解析SQL,将其分解为能够转换为执行计划的树结构,根据SQL的复杂程度,这个处理过程可能很多。下一步是优化器—RBO或者CBO,在近期的版本中Oracle推荐CBO,因为RBO对于优化执行计划不够聪明。
如果使用CBO,它将会查看查询将使用的资源情况以及和对象相关的索引和约束,然后算出一个比较好的策略完成执行查询。这通常会耗费几微秒。
所以提高性能的一个重要问题是尽可能使SQL具有相同的哈希值,使其能够在库缓存中找到以避免解析。关键是使用绑定变量:
begin
:a := 'SYS';
end;
/
select table_name
from dba_catalog
where owner = :a;
begin
:a := 'SYSTEM';
end;
/
select table_name
from dba_catalog
where owner = :a;
如果使用绑定变量,随后的语句就不需要解析—优化—建立计划步骤。
因此,在程序过程中要通常使用绑定变量,即使在动态SQL中也是如此,因为大多数查询只是条件的值不同而已。