oracle计算时sum溢出_Oracle9i性能调整学习指南笔记(二)

新服务器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

阅读(2173) | 评论(0) | 转发(0) |

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值