ORACLE性能优化之硬分析、软分析

转载 2012年03月23日 14:32:16

有如下两句查询语句:

1.SELECT * FROM EMP WHERE EMPNO = 123;

2.SELECT * FROM EMP WHERE EMPNO = :EMP_NO;

1句中查询员工编号是123的员工信息,ORACLE第一次经过分析编译后执行。但如果下次还要再查询编号为456和789的员工信息时,ORACLE将会再将这句SQL分析编译,然后再执行。

再看2句,首先定义变量EMP_NO,我们将123赋给变量,第一次的时候也是经过分析编译后再执行,但是到了接下来再想查询其他员工编号的信息时,ORACLE会将第一次编译后的查询方案(在第一次编译执行之后已经储存在共享池中)用来进行下一次的查询。

这就像JAVA,想想看,如果你用JAVA写了一个软件,给客户的是你写的JAVA代码,客户在每次使用的时候都耀编译代码,然后执行。这将会影响多大啊。

所以说,分析一个带有硬编码变量的语句(称为硬分析)要明显的比重用一个已经分析过的查询方案(软分析)要花费更长的时间和耗费更多的资源。

如果使用绑定变量,提交引用相同变量的完全相同的查询的人将会使用共享池中的编译方案,只需编译子例程一次,就可以重复使用。这样不仅可以使用较少的时间,而且可以减少锁存时间,降低锁存频率。这将会提高软件性能,大大提高可伸缩性。

下面的试验将更能说明这个道理:

ALTER SYSTEM FLUSH SHARED_POOL;

SET ERVEROUTPUT ON;

SET TIMING ON;

DECLARE
          TYPE rc IS REF CURSOR;
          l_rc rc;
          l_dummy all_objects.object_name%TYPE;
          l_start NUMBER DEFAULT dbms_utility.get_time;
BEGIN
          FOR i IN 1 .. 1000 LOOP
          OPEN l_rc FOR 'select object_name from all_objects where object_id = '||i||' ';
          FETCH l_rc INTO l_dummy;
          CLOSE l_rc;
          END LOOP;
          dbms_output.put_line(round((dbms_utility.get_time-l_start)/100,2)|| 'seconds ...');      
END;

/

PL/SQL 过程已成功完成。

已用时间:   00: 00: 53.05

上述代码使用动态SQL从ALL_OBJECTS表中查询单行。它用值1,2,3.......1000等硬编码产生1000条不同的查询进入WHERE子句,看看运行时间54秒。

再看下面代码:

DECLARE
        TYPE rc IS REF CURSOR;
        l_rc rc;
        l_dummy all_objects.object_name%TYPE;
        l_start NUMBER DEFAULT dbms_utility.get_time;
BEGIN
        FOR i IN 1 .. 1000 LOOP
        OPEN l_rc FOR 'select object_name from all_objects where object_id = :x' USING i;
        FETCH l_rc INTO l_dummy;
        CLOSE l_rc;
        END LOOP;
        dbms_output.put_line(round((dbms_utility.get_time-l_start)/100,2)|| 'seconds ...');  
END;

/


PL/SQL 过程已成功完成。

已用时间:   00: 00: 00.03

!!!!!!!    0.03秒,差距竟然这么大,回头看代码,第二次只是在循环体中使用了变量X,将i的值赋给了X,这样一来,ORACLE在执行的时候只需要编译一次,其他999次都是从共享池中使用查询方案,查询时间和速度当然更快了。

所以。从软件开发的一开始就要认识到绑定变量的重要性。


转自:http://hi.baidu.com/lxw1234/blog/item/8894e8efe6ce5935adafd560.html

相关文章推荐

Oracle10g性能分析与优化思路.doc

  • 2013年04月19日 15:00
  • 388KB
  • 下载

Oracle性能优化读书笔记(1)-SQL执行计划分析工具

学习主要的SQL执行计划分析工具,参考罗敏的品味Oracle性能优化

让Oracle跑得更快:Oracle 10g性能分析与优化思路

第1章 引起数据库性能问题的因素 1.1 软件设计对数据库的影响 1.1.1 软件架构设计对数据库性能的影响 1.1.2 软件代码的编写对数据库性能的影响 1.2 数据库的设计 1.2.1 ...

oracle中union和union all区别与性能分析

[ 概要 ] 经常写sql的同学可能会用到union和union all这两个关键词, 可能你知道使用它们可以将两个查询的结果集进行合并, 那么二者有什么区别呢? 下面我们就简单的分析下. ...
  • zdp072
  • zdp072
  • 2014年05月13日 23:34
  • 6791
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:ORACLE性能优化之硬分析、软分析
举报原因:
原因补充:

(最多只允许输入30个字)