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

PLSQL_解析过程及硬解析和软解析的区别(案例)

转载于http://www.cnblogs.com/eastsea/p/3904874.html 2014-08-11 Created By BaoXinjian 一、摘要 Orac...
  • qq_24369113
  • qq_24369113
  • 2016年08月05日 16:33
  • 769

oracle学习笔记 SQL语句解析类型_硬解析_软解析

oracle学习笔记 SQL语句解析类型_硬解析_软解析 shared pool在讲oracle体系结构概述时讲了大体是干什么的, 这节把一些细节讲一下。 一)软件出问题 在...
  • xinzhan0
  • xinzhan0
  • 2016年07月28日 17:29
  • 778

彻底弄懂oracle硬解析、软解析、软软解析

硬解析和软解析有相同的一步,而软软解析与硬解析、软解析完全不一样。先来说下理论上的东西,然后来做个实验。 硬解析过程:     1.语法、语义及权限检查;     2.查询转换(通过应用各种不同的转换...
  • guogang83
  • guogang83
  • 2013年12月11日 17:47
  • 5538

Oracle硬解析,软解析,软软解析介绍

Oracle数据库中的CURSOR分为两种类型:Shared Cursor 和 Session Cursor 1,Shared Cursor Oracle里的第一种类型的Cursor就是Shared ...
  • waterxcfg304
  • waterxcfg304
  • 2016年06月25日 14:03
  • 1573

Android性能优化之Systrace分析UI性能

当你是一位程序员其实很有必要对写完的代码负责任,是否你会怀疑自己写的代码已经是完美了。我常常很奇怪的怀疑自己写的代码这里不行那里可能有问题,当这些疑问都出来的时候怎么让自己安心呢?那就是让自己的代码经...
  • Neacy_Zz
  • Neacy_Zz
  • 2015年12月25日 19:03
  • 4010

Oracle 硬解析与软解析

--======================= -- Oracle 硬解析与软解析 --======================= Oracle 硬解析与软解析是我们经常遇到的问题,什么情况会...
  • fuzhangpeng
  • fuzhangpeng
  • 2013年09月08日 17:40
  • 434

ORA-03114之原因分析,含CDC引发问题处理参考

今天排查一个故障:现象是当ASP.NET通过ORACLECLIENT连接ORACLE数据库时会不规律的在一段时间后,报错:ORA-03114,不能连接到ORACLE.当时觉得是ORACLE服务的故障,...
  • yiruoyun
  • yiruoyun
  • 2008年07月01日 12:23
  • 6190

软实时和硬实时操作系统的区别

操作系统按硬件范畴的表现形式分:芯片级嵌入(含程序或算法的处理器)、模块级嵌入(系统中的某个核心模块)系统级嵌入。   按软件范畴实时性要求分:非实时系统、软实时系统、硬实时系统。对实时系统,他的正...
  • softn
  • softn
  • 2016年07月10日 16:55
  • 2508

对SVM的理解

之前以为SVM很强大很神秘,自己了解了之后发现原理并不难,不过,“大师的功力在于将idea使用数学定义它,使用物理描述它”,这一点在看SVM的数学部分的时候已经深刻的体会到了,最小二乘法、梯度下降法、...
  • mghhz816210
  • mghhz816210
  • 2014年07月01日 19:19
  • 3131

团队开发的“软约束”和“硬约束”

大型项目需要团队开发。 团队开发的标准之一是“千人一面”。即不同的人开发的代码在形式和风格上保持一致,就像一个人开发出来的一样。 为了做到这一点,需要事先制定“软约束”和“硬约束”。   “软...
  • tiangej
  • tiangej
  • 2011年12月19日 23:12
  • 1212
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:ORACLE性能优化之硬分析、软分析
举报原因:
原因补充:

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