Chinaunix首页 | 论坛 | 博客
  • 博客访问: 231146
  • 博文数量: 36
  • 博客积分: 1137
  • 博客等级: 少尉
  • 技术积分: 305
  • 用 户 组: 普通用户
  • 注册时间: 2007-12-06 09:58
文章分类

全部博文(36)

文章存档

2012年(1)

2011年(31)

2010年(3)

2007年(1)

分类: Oracle

2011-11-29 16:04:23

新服务器SGA计算:
物理内存 x 0.55 = SGA内存总量(TSGA)
每个实例的总SGA1 = TSGA/服务器ORACLE实例个数
shared pool = TSGA1 x 0.45
db buffer cache = TSGA1 x 0.45
redo log buffer = TSGA1 x 0.10
(redo log buffer没必要10%,在调整统计数据可用后,可以随时从这部分取走内存给其他pool)

以上适合1GB服务器,如果1GB以上应该把55%改为60-75%
######################################################################################


第四章 调整共享池

======了解共享池
SELECT last_name,first_name
FROM customers
WHERE customer_id=2201;
当发布一条SQL或PL/SQL:
   --1.ORACLE把该语句中的那些字符转换成它们的ASCII等效数字码。
   --2.传递ASCII给散列算法,产生一个单独的散列值。
   --3.该用户的server process查看共享池,如果该散列值存在则该serverprocess就使用高速缓存版本来执行该语句。
   --4.如果不存在,则Serverprocess对该语句进行语法分析过程(增加系统开销),然后执行它。

语法分析步骤:
   --1.检查该语句的语义正确性。
   --2.执行对象解析,对照数据目录检查被引用对象的名称和结构。
   --3.通过检查数据目录来收集与该查询中所引用的各对象有关的统计数据。
   --4.准备并从可用的执行计划中选择一个执行计划,其中包括存储大纲或物化视图相关的决定。
   --5.通过检查数据目录来确定该查询中所引用的那些对象的安全性。
   --6.生成该语句的一个编译代码(P_Code)。

共享池的组件:
library cache
data dictionary cache
user global area

*libarary cache
存储的组件:
该语句的实际文本
该语句关联的散列值
该语句的P_Code
该语句关联的统计数据
该语句的执行计划

--查看每种数据库对象类型的执行次数
SQL> select type,count(executions)
from v$db_object_cache
group by type
order by 2 desc;

TYPE                 COUNT(EXECUTIONS)
---------------------------- -----------------
CURSOR                     36070  
NOT LOADED                 13066
TABLE                       226
SEQUENCE                    33
PACKAGE                     23
VIEW                        22
PACKAGE BODY                    20
PROCEDURE                    19
SYNONYM                     16
FUNCTION                     9
PUB_SUB                      9
CLUSTER                      6
INDEX                         4
NON-EXISTENT                     4
TRIGGER                      3

15 rows selected. -->高CURSOR執行次數和低PACKAGE BODY与PACKAGE执行次数联合表明,大部分应用程式SQL是直接发布而不是利用存储过程或函数。
        -->把直接SQL的一部份转换成PL/SQL或函数可以改善共享池性能。


*Data dictionary cache

*UGA
  共享服务器选项,UGA存在共享池中;
  专用服务器选项,UGA存在PGA中;

====== 测量共享池的性能
  主要指标是高速缓存区命中率,命中率可以针对library cache和dictionary cache两者计算.  
  note:调整db buffer cache前先调整library cache(比DB BUFFER CACHE影响大)并使它命中率最大化。

====library cache性能命中率
---通过SQL语句
SQL> select namespace,gethitratio,reloads,invalidations
    from v$librarycache
    where namespace in ('SQL AREA','TABLE/PROCEDURE','BODY','TRIGGER');

NAMESPACE    GETHITRATIO    RELOADS INVALIDATIONS
--------------- ----------- ---------- -------------
SQL AREA     .915171837  140831924          112986
TABLE/PROCEDURE  .999651802    3241073           0
BODY         .997985721     20476           0
TRIGGER      .997609605      2761           0


GETHITRATIO:
 用戶能在library cache中查找到他们所发布的SQL语句比例;
 主要是针对语法分析;
 GET:当一条SQL被语法分析一次,就增加1.
 GETHITS:在内存中找到SQL语法分析副本一次就增加1.
 GETHIRATIO=(GETHITS*100)/GETS
 越大越好
 OLTP要大于90%,充分调整后应该有95%以上
 

PINHITRATIO:
  表示被执行语句在library cache中查找到相应的已语法分析SQL的比例

RELOADS:
  因语法分析版本过久重新分析的次数。
  Reload ratio=sum(reloads)/sum(pins) 充分调整后的其值应该小于1%
SQL> select sum(reloads)/sum(pins) "reload ratio"
    from v$librarycache;

reload ratio
------------
  .051102766

INVALIDATIONS:
  在librarycache中已高速緩存的SQL语句被标记为无效而被迫重做语法分析;
  每当已缓存语句所引用的对象以某种方式被修改时,就会被标记为无效;

---通过STATSPACK
*Instance Efficiency Percentages中的librarycache命中率是96.07%

Instance Efficiency Percentages (Target 100%)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
            Buffer Nowait %:  100.00       Redo NoWait %:    100.00
            Buffer  Hit   %:   99.93    In-memory Sort %:    100.00
            Library Hit   %:   96.07        Soft Parse %:     91.50
         Execute to Parse %:  -30.11         Latch Hit %:     99.90
Parse CPU to Parse Elapsd %:   85.96     % Non-Parse CPU:     90.04

 
*Library Cache Activity for DB中显示了失敗和重载的信息。
SQL AREA名称空间的get requests操作活動,pct miss是7.6,即7.6%,相反表示librarycache的sqlarea部份在监视期间的命中率是1-7.6%=92.4%

Library Cache Activity for DB: ADB  Instance: adb1  Snaps: 891 -911
->"Pct Misses"  should be very low

                         Get  Pct        Pin        Pct               Invali-
Namespace           Requests  Miss     Requests     Miss     Reloads  dations
--------------- ------------ ------ -------------- ------ ---------- --------
BODY                  13,759    0.8         13,816    1.4         41        0
CLUSTER                1,911    0.9          2,097    1.6          0        0
SQL AREA           8,472,003    7.6     30,536,984    5.2    272,637      247
TABLE/PROCEDURE    3,992,300    0.0      9,979,664    0.2      7,742        0
TRIGGER               28,795    0.0         28,795    0.1         10        0
          -------------------------------------------------------------

====Dictionary cache性能命中率
如果小于85%需要考虑调整shared pool
1.通过SQL
SQL> select 1-(sum(getmisses)/sum(gets)) "Data Dictionary Hit Ratio"
    from v$rowcache;

Data Dictionary Hit Ratio
-------------------------
        .99893883

2.通過statspack
命中率= 1-pctmiss/100
下图列出了data dictionary cache各组件信息
如果dc_free_extents,dc_object_ids等命中率低於大多数组件的98%也要考虑调整shared pool

Dictionary Cache Stats for DB: ADB  Instance: adb1  Snaps: 891 -911
->"Pct Misses"  should be very low (< 2% in most cases)
->"Cache Usage" is the number of cache entries being used
->"Pct SGA"     is the ratio of usage to allocated size for that cache

                                   Get    Pct    Scan   Pct      Mod      Final
Cache                         Requests   Miss    Reqs  Miss     Reqs      Usage
------------------------- ------------ ------ ------- ----- -------- ----------
dc_database_links                2,182    0.9       0              0          6
dc_files                           504   22.2       0              0          0
dc_global_oids                      12   41.7       0              0          0
dc_histogram_defs               69,847   12.5       0              0        689
dc_object_ids                4,338,544    0.1       0              0        638
dc_objects                   1,662,014    0.2       0              0        470
dc_profiles                     23,957    0.1       0              0          5
dc_rollback_segments           372,822    0.0       0              0        766
dc_segments                  4,820,981    0.1       0              2        793
dc_sequences                     1,485   58.2       0          1,485          7
dc_tablespace_quotas                 2  100.0       0              2          0
dc_tablespaces                  16,317    0.6       0              0         14
dc_user_grants               1,160,669    0.0       0              0         31
dc_usernames                 1,641,082    0.0       0              0         17
dc_users                     2,341,372    0.0       0              0         36
          -------------------------------------------------------------



=============改进shared pool性能的方法
使之更大
为大型PL/SQL语句腾出空间
将重要PL/SQL代码保存在内存中
鼓励代码重用
调整LIBRARY CACHE相关参数

====使之更大

--当前shared pool的大小
SQL> select pool,sum(bytes)
    from v$sgastat
    where pool='shared pool'
    group by pool;

POOL         SUM(BYTES)
------------ ----------
shared pool  754974720

--评估适当的shared pool大小:
set echo off
set feedback off
set serveroutput on

DECLARE
  v_total_plsql_mem    number := 0;
  v_total_sql_mem    number := 0;
  v_total_sharable_mem    number := 0;
BEGIN
  -- find the total sharable memory used by non-sql objects
  -- like packages,views,etc.

  SELECT sum(sharable_mem)
  INTO v_total_plsql_mem
  FROM v$db_object_cache;

  -- find the total sharable memory used by sql statements
  SELECT sum(sharable_mem)
  INTO v_total_sql_mem
  FROM v$sqlarea
  WHERE EXECUTIONS > 10;

  -- now add these two value to get the sharable memory
  -- (i.e library cache) requirements
  v_total_sharable_mem    := v_total_sql_mem + v_total_plsql_mem;
  DBMS_OUTPUT.PUT_LINE
    ('Estimated required shared pool size is: '||TO_CHAR(v_total_sharable_mem,'fm9,999,999,999,999')||' bytes');
END;
/
Estimated required shared pool size is: 440,400,492 bytes

====为大型PL/SQL语句腾出空间
*使用保留区
使用shared_pool_reserved_size保存大型PL/SQL,该值默认是5%,推荐为10%
要确定保留池的最佳大小,可以监视v$db_object_cache

--查询当前已缓存在内存中的PL/SQL程序包名称和大小:
SQL> select owner,name,sharable_mem
    from v$db_object_cache
    where type in ('PACKAGE','PACKAGE BODY')
    order by sharable_mem;

--查询保留区使用情况:
SQL> select REQUEST_MISSES,FREE_SPACE,USED_SPACE,REQUEST_FAILURES,
    FREE_SPACE/(FREE_SPACE+USED_SPACE) as "free hit"
    from v$shared_pool_reserved;

REQUEST_MISSES FREE_SPACE USED_SPACE REQUEST_FAILURES    free hit
-------------- ---------- ---------- ---------------- ----------
     14274      5776336   24445664          984  .19113017

保留区大小过大:
  -REQUEST_MISSES始终是0或静态;
  -FREE_SPACE是分配给保留区的总大小的50%以上,上列为19%;
保留区大小过小:
  -REQUEST_FAILURES非零或不断增长表明保留区太小;
保留区使用目标:
  -尽量让REQUEST_MISSES,REQUEST_FAILURES保持在零附近;

*使用dbms_shared_pool.aborted_request_threshold
EXECUTE dbms_shared_pool.aborted_request_threshold (10000);
本例允许一个大PL/SQL对象从shared_pool的LRU中清洗多达10,000个字节。
如果超出这个强加限制,ORACLE将返回一个内存溢出错误给用户。


=====把重要的PL/SQL保持在内存中
  使用dbms_shared_pool把PL/SQL包pinning在內存中;
  步驟:
     --建立DBMS_SHARED_POOL
     SQL> @$ORACLE_HOME/rdbms/admin/dbmspool.sql
     --使用DBMS_SHARED_POOL,KEEP用來锁定,UNKEEP用来取消锁定
     SQL> EXECUTE DBMS_SHARED_POOL.KEEP ('APPROVE_PO');
     --找出已被pinning的对象:
     SQL> select owner,name,type
        from v$db_object_cache
       where kept='YES';

哪些对象需要锁定?
  1、开启ORACLE审计功能,一段时间后查看哪些对象访问频繁,考虑锁定这些对象。
  问题:怎么开启审计并查看对象访问情况?
  2、改写大的无名PL/SQL块所包含的SQL语句:
   --应将超出500字符的任何无名PL/SQL块重写一个存储过程或程序包
SQL> select substr(sql_text,1,45) sql,length(sql_text) "stmt_size"
    from v$sqlarea
    where command_type=47
    order by length(sql_text);
    
何时锁定:
   锁定的对象在实例重启后会消失,需要重新锁定;
   可以实例启动后手动执行一个SQL脚本实现锁定;
   或实例已启动由一个AFTER STARTUP ON DATABASE触发器自动实现;

====影响LIBRARY CACHE的参数:
shared_pool_size
open_cursors
cursor_space_for_time
session_cached_cursors
cursor_sharing

阅读(3453) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~