当前位置:  数据库>oracle

Oracle性能优化 之 库缓存

    来源: 互联网  发布时间:2017-04-23

    本文导语: 一、库缓存中的信息 1.什么是执行计划 2.为什么要共享执行计划 执行计划的生成要耗费许多CPU时间,而且优化器会将生成的执行计划存放到共享池中。如果你执行很多相同的语句,但没有共享执行计划,优化器每次都要搜索...

一、库缓存中的信息

1.什么是执行计划

2.为什么要共享执行计划

执行计划的生成要耗费许多CPU时间,而且优化器会将生成的执行计划存放到共享池中。如果你执行很多相同的操作系统 iis7站长之家,但没有共享执行计划,优化器每次都要搜索共享池、查找有没有可以共享的执行计划,没有查找后它自己生成,再把生成的执行计划存入共享池。就是说相同的语句如果你没有共享计划,不但消耗了更多的CPU生成执行计划,而且每次还要搜索共享池、保存新生成的执行计划,并且,管理共享池中的执行计划还会有一些额外的负担。这些工作都会拖慢SQL语句的执行速度Oracle并不会因为你没有共享执行计划而取消有关执行计划的一些管理性工作。打个比方,你有一辆自行车,你本来可以骑着它加快速度,但你不但不骑它,反而扛着它,结果是速度大大减慢。Oracle明明提供了一块内存叫做库缓存,希望你可以在其中共享执行计划,就算你不共享,库缓存还是要存在的,这个时候,你就相当于扛着自行车在走了。你没有把库缓存的优势发挥出来,你却承受了库缓存的管理负担。因此,共享执行计划是最优化使用共享池的最重要一点。

二、库缓存的调优

库缓存的调优最重要一点就是确做用户可以共享执行计划。这应该从程序员DBA两个角度去作。作为程序员,应该学会使用绑定变量,这可以使本来相似的语句变得一模一样,从而使它们可以共享执行计划。下面,让我们先来了解一下什么样的情况下,执行计划才能被共享。

1.共享执行计划

要共享执行计划,语句的文本必须一模一样,比如,如下的语句就不能共享执行计划:

语句1:Select * from tab1 where id=1;

语句2:select * from tab1 where id=1;

为什么语句1和语句2不能共享执行计划呢?第一个语句的第一个字母是大写,而第二个语句第一个字母是小写。不但大小写,就算多了一个空格,也不能共享执行计划。

假设上面两条语句的文本完全一样的,但语句1在用户USER1下发出,语句2在用户USER2中发出。并且这两个用户下都有自己的TAB1表,那么这两个语句也不能共享计划。

如果两条语句要想共享计划,两条语句的文本不但要完全相同,语句执行时的环境也必须完成相同才行。这里所说的“环境”,指的是一些初始化参数的值。并不是指不同的用户。当然,如果两个用户分别操作不同的表,在表名相同的情况下,是不会共享执行计划的。如果两个用户发出文本相同的语句,操作的又是同一个表,那么,是可以共享执行计划的。那么,不同的用户,如何用同样的名字操作同一表呢?接着上面的例子,假设USER1中有一个TAB1表,而USER2中没有,USER1的查询语句形式如下:

    select * from tab1 where id=1;

USER2想要查询USER1中的表,形式如下:

    select * from user1.tab1 where id=1;

这两条语句也不能共享执行计划,因为语句文本有很大的不同。USER2的语句多了一个“USER1.”。对于这样的情况,我们可以使用公用同义词使USER2访问TAB1表时,不必在表名前加“USER1.”来解决。看下面的例子:

(举一个这样的例子)

也就是说,只要语句文本一模一样,执行语句时的环境一模一样,两条语句就可以共享执行计划。


2.绑定变量

再看下面一种情况。假设有一个大型网站,每天要有大量的用户登录用户信息存储在一个User_info表中,每个用户登录时,都要输入用户ID和密码数据库根据用户ID在User_info中进行查询,取出用户密码和其他的一些用户基本信息,等等,后面的工作我就不说了,就是每个用户在登录时,数据库都要根据用户ID进行一次查询,假设又有两个用户登录了,一个用户的ID是1另一个用户ID是2。这两个用户登录时的查询语句如下:

用户1的查询语句:select * from user_info where id=1;

用户2的查询语句:select * from user_info where id=2;

这两条语句是不会共享执行计划的。我们可以实验一下:

Step1:在139号会话中发布查询语句:

SQL> select * from tab1 where id=1;

        ID NAME

---------- ----------

         1 ICOL$

         1 i_obj#

此语句是首次查询TAB1表,这将引出大量的递归调用,这些递归调用将会进行多次硬解析。以后我们在发布以TAB1的查询时,将不会有递归调用。这一步,是会下面的实验做准备,下面开始实验。


Step2:在另一会话中查询会话139的解析情况:

sql> select name,value from v$sesstat a ,v$statname b where a.statistic#=b.statistic# and a.sid=139 and b.name like '%parse%';

NAME                                                                  VALUE

---------------------------------------------------------------- ----------

parse count (total)                                                     386

parse count (hard)                                                       60

parse count (failures)                                                    0


Step3:在139会话发出查询语句:

SQL> select * from tab1 where id=2;

        ID NAME

---------- ----------

         2 I_USER1

         2 PROXY_ROLE


Step4:在另一会话中再次查询会话139的解析情况:

SQL> select name,value from v$sesstat a ,v$statname b where a.statistic#=b.statistic# and a.sid=139 and b.name like '%parse%';

NAME                                                                  VALUE

---------------------------------------------------------------- ----------

parse count (total)                                                     387

parse count (hard)                                                       61

parse count (failures)                                                    0


Step5:在139人再次发出相似的查询语句:

SQL> select * from tab1 where id=3;

        ID NAME

---------- ----------

         3 CON$

         3 I_IND1


Step6:再次查询139会话中的解析情况:

SQL> select name,value from v$sesstat a ,v$statname b where a.statistic#=b.statistic# and a.sid=139 and b.name like '%parse%';

NAME                                                                  VALUE

---------------------------------------------------------------- ----------

parse count (total)                                                     388

parse count (hard)                                                       62

parse count (failures)                                                    0


这个实验的结果我们已经看到了,这两条语句不同共享执行计划。试想如果每天有大量的用户登录,每个用户在登录时,都无法共享相似语句的执行计划,这将白白耗费多少CPU时间啊。这个时间就是绑定变量派上用场的时候了。下面我们先来看个使用绑定变量的例子:

Step1:在139会话中定义绑定变量User_id,并将它的值赋为4。

SQL> var user_id number;

SQL> exec :user_id:=4;

PL/SQL 过程已成功完成。


Step2:在139会话中使用绑定变量进行查询:

SQL> select * from tab1 where id=:user_id;

        ID NAME

---------- ----------

         4 UNDO$

         4 I_CDEF2


    
 
 

您可能感兴趣的文章:

  • Oracle内存数据库11g和高速缓存11g上市
  • Oracle 数据库(oracle Database)性能调优技术详解
  • Oracle收购TimesTen 提高数据库软件性能
  • 关于提高Oracle数据库性能的四个错误认识
  • 用Oracle动态性能视图采集查询调优数
  • Oracle性能究极优化 上第1/2页
  • 用PHP连mysql比oracle数据库性能好
  • Oracle性能究极优化 下
  • 保持Oracle数据优良性能的技巧分享
  • 100分寻求最优化的连接oracle的java程序,请给我讲出理由,我是初学者,在做项目时不想让连接oracle影响我的程序性能
  • Oracle数据库应用程序性能优化探究
  • oracle 使用递归的性能提示测试对比
  • 善用Oracle表空间设计提升数据库性能
  • Oracle性能究极优化
  • Oracle SQL性能优化系列学习一
  • Oracle SQL性能优化系列学习三
  • Linux平台下如何监控Oracle数据库的性能
  • Oracle SQL性能优化系列学习二
  • 性能陷阱:Oracle表连接中范围比较
  • 基于Oracle的高性能动态SQL程序开发
  • 浅谈Oracle性能优化可能出现的问题
  • 如何保持Oracle数据库的优良性能
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • Oracle 12c发布简单介绍及官方下载地址
  • 在linux下安装oracle,如何设置让oracle自动启动!也就是让oracle那个服务自动启动,不是手动的
  • oracle 11g最新版官方下载地址
  • 请问su oracle 和su - oracle有什么不同?
  • Oracle 数据库(oracle Database)Select 多表关联查询方式
  • 虚拟机装Oracle R12与Oracle10g
  • Oracle数据库(Oracle Database)体系结构及基本组成介绍
  • Oracle 数据库开发工具 Oracle SQL Developer
  • 如何设置让Oracle SQL Developer显示的时间包含时分秒
  • Oracle EBS R12 支持 Oracle Database 11g
  • Oracle 10g和Oracle 11g网格技术介绍
  • SCO unix下安装oracle,但没有光盘,请大家推荐一个oracle下载站点(unix版本的)。谢谢!!!!
  • oracle中如何把表中具有相同值列的多行数据合并成一行
  • 请问大家用oracle数据库, 用import oracle.*;下的东西么? 还是用标准库?
  • ORACLE日期相关操作
  • Linux /$ORACLE_HOME $ORACLE_HOME
  • ORACLE数据库常用字段数据类型介绍
  • Linux系统下Oracle的启动与Oracle监听的启动
  • Oracle 12c的九大最新技术特性介绍
  • 请问在solaris下安装ORACLE,用root用户和用oracle用户安装有什么区别么?
  • ORACLE中DBMS_RANDOM随机数生成包
  • 网间Oracle的连接,远程连接Oracle服务器??


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3