首页 | 互联网 | IT动态 | IT培训 | Cisco | Windows | Linux | Java | .Net | Oracle | 软件测试 | C/C++ | 嵌入式开发 | 存储世界 | 服务器
网络设备 | IDC | 安全 | 求职招聘 | 数字网校 | 网页设计 | 平面设计 | 技术专题 | 电子书下载 | 教学视频 | 源码下载 | 搜索 | 博客 | 论坛
中国IT实验室Oracle频道
中国IT教育
Google
首页 入门基础 安装配置 体系架构 PLSQL 备份恢复 性能调优 开发技术 资讯动态 考试认证 下载 专题 讨论
您现在的位置: 中国IT实验室 >> Oracle >> 考试认证 >> 正文

OCP认证033之自制讲稿—调整共享池



19. 匿名PL/SQL块
    /怎样找出匿名块,找到后该怎么优化
     --查询视图v$sqlarea中command_type=47的SQL,这个就是匿名块,比如
       select sql_text from v$sqlarea where Command_type=47 and length(sql_text)>500
     --一般来说找到他们后尽可能的把他们转换成小的包函数,但是如果不能转化又怎么办,那就把他们栓住啊,
     比如,步骤如下:
     1) declare x number                 declare /* KEEP_ME */ x number
        begin x:=5       ------------->  begin x:=5;
        end;                             end;
     2) select address, hash_value from v$sqlarea where command_type=47 and sql_text like '%KEEP_ME%';
     3) execute dbms_shared_pool_keep('address,hash_value');这里'address,hash_value'是上面查出来的值啊

20. 影响库缓存的其他一些参数
    /open_cursors     50(default)|n
      这个参数定义了在用户进程的私有(不共享)SQL区域最多能打开的游标数量,对于中型应用一般设为300
    /Cursor_space_for_time  false(default)|true
      表示是否缓存cursor, true能够提高命中率,但增加负荷,慎重,那什么时候可以改为true呢?
      因为设置为true, 你是那空间来换时间,如果你有足够的内存,能使V$librarycache中reloads等于0或者趋近0的时候,你当然可以设置为true.
      如果你的应用使用了oracle forms和任何动态SQL, oracle建议保留默认值false
    /session_cached_cursors 0(default,不缓存)
     如果应用程序是form型的,将这个值设为true,可以改进库缓存的命中率,因为窗体中所包含的SQL语句将被缓存,当窗体来回切换时可以减少重分析的次数。
    /Cursor_sharing   exact|similar|force
      这个前面已经详细介绍过,这里不再介绍了,大家如果不清楚可以翻看前面。
 
21. 调整数据词典缓存
    前面我们一直在讨论的是库缓存,大家知道,共享池中还有一个很重要的组件,那就是数据词典缓存。这讲开始我们开始讨论这个问题。
    /存放的内容:数据对象的定义
    /使用v$rowcache视图可以得到数据词典缓存中的信息,主要有了解三个列
     --paramter: 缓存中数据词典的名称
     --gets:     请求的总次数
     --getmisses: 请求时没有在缓存中找到的次数,丢失
    /优化目标:避免丢失,提高命中率, 丢失率:getmisses/gets
    /要调整数据词典缓存大小,只能通过改变shared_pool_size参数来调整
    /在实例刚起来的时候,由于数据词典缓存中没有数据,所以任何执行的SQL第一次都需要从磁盘文件加载数据词典,产生缓冲丢失。但是,随着数据库稳定持续的运行,常用的数据词典对象就应该缓存到了内存中,在这个时候,缓存丢失发生的几率就应该很小。为了调优数据词典缓存,应该实在应用已经稳定持续运行了一段时间,而不是instance启动的时候。

22. 怎样测量数据词典性能
   /V$rowcache
   /比较重要的每行的丢失率应该小于2%, 整体丢失率应该小于15%
   --单个/每行
     select parameter, getmisses, gets, (getmisses/gets)*100 "miss ratio %" from v$rowcache;
   --整体丢失率和命中率
     select sum(getmisses)/sum(gets)*100 "miss ratio %",
            (1-sum(getmisses)/sum(gets))*100 "Hit ratio %"
     from v$rowcache;
   --如果丢失率高,说明共享池小,需要调整共享池大小
   /statspack报告中的 dictinary cache stats 部分,丢失率应该比较低,高说明有性能瓶颈
   例  cache                   get     Pct      ........         Pct
                          requests    Miss                       SGA
       -------------------------------------------------------------
       dc_free_extent            4     0.0                        88
       .............
       dc_usernames             28     3.6                        81
       dc_users                 45     0.0                        86
     Pct Miss表示丢失率,pct SGA表示为对应cache分配的内存空间的使用率
     如果pct SGA和pct Miss都大的话,说明请求数高,并且丢失率也高,也就是暗示共享池太小。
   /调整,如果丢失率高的话,我们就需要考虑增加共享池的大小了
   alter system set shared_pool_size = 更大的值 scope=both|memeory|spfile;
   /由于实例刚起来的时候缓冲中没有数据,所以丢失率不可能等于0,随着持续稳定的运行,我们希望他趋近于0
   /oem工具:performace manager-->shared pool statistic
      --memory: SGA Overview
      --Database Instance: libary cache Hit %
      --top sessions: top session

23. UGA和ORACLE共享服务器
   前面我们讨论了库缓存和数据词典缓存,下面我们来了解一下UGA和oracle共享服务器
   /专用服务器下,我门知道每个用户进程都有一个PGA, PGA用于存放:
      用户会话信息,游标State, 私有SQL区域/Sort Area,堆栈
   /共享服务器,PGA依然存在,但只有堆栈数据了,其他的几个内容都被放到UGA区域了,
    UGA对server process来说是共享的,不是为那个单独服务的,而PGA是一个server process一个单独的
    --UGA到底放在那里呢,如果配置了大池则放在大池里,如果没有配置大池,就会在共享池中抢一块空间出来
   /使用共享服务器时,能够节省内存空间,UGA+所有PGA的大小要小于专用服务器下所有PGA的大小

24. 计算UGA使用的大小
    /计算你的连接的UGA大小
    SELECT SUM(value) ||'bytes' "Total session memory"
    FROM v$mystat, v$statname
    WHERE name = 'session uga memory'
    AND v$mystat.statistic# = v$statname.statistic#;
    --mystat 仅只有你自己当前会话的信息
    /计算共享服务下所有用户使用的UGA大小
    SELECT SUM(value) ||'bytes' "Total session memory"
    FROM v$sesstat, v$statname
    WHERE name = 'session uga memory'
    AND v$sesstat.statistic# = v$statname.statistic#;
    /计算UGA曾经用到的最大空间
    SELECT SUM(value) ||'bytes' "Total max memory"
    FROM v$sesstat, v$statname
    WHERE name = 'session uga memory max'
    AND v$sesstat.statistic# = v$statname.statistic#;

25. 大池 large pool
    这一讲的最后我们来说说大池,其实我们前面已经有很多地方提到过了他,相信大家还记得。
    /什么时候用大池呢
     --OS不支持异步I/O,为了提高DBWn的速度,使用IO奴隶(DBWR_IO_SLAVES),不过现在的操作系统基本上都支持异步I/O,所以很少使用
     --使用RMAN备份和恢复操作
     --共享服务器的UGA(session memory)
     --并行查询
    /由参数large_pool_size参数来调整大小,也是动态参数
    /在共享服务器模式下,设置大池,UGA会从Shared pool中移到大池中,这样可以把共享池的内存留给库池和数据词典用,这样可以避免
      共享的SQL由于空间不够而被赶出去和额外的空间争用。
 
好,到这里这一讲关于共享池的调优基本上讲完了,如果还有什么问题可以提问,谢谢大家!

上一页  [1] [2] [3] 

【责编:Yoyo】

中国IT教育

相关产品和培训
文章评论
 友情推荐链接
 认证培训
 专题推荐

 ·关于Java框架技术专题
 ·XML全攻略技术专题
 ·JAVA开源技术介绍专题
 ·Java嵌入式开发之J2ME技术专题
 ·超前体验 Oracle 11g的5个新特性…
 ·揭密使用VB.NET的五个实用技巧
 ·Oracle和SQL Server常用函数对比专题…
 ·展现C#世界 C#程序设计专题…
 ·Java入门 Tomcat的配置技巧精华专题…
 ·Oracle RMAN物理备份技术详解…
 今日更新
 社区讨论
 博客论点
 频道精选
 Oracle频道相关导航