Oracle第三话之设置共享池大小

目录

1、笔记

2、library cache中sql语句的执行过程

3、查看硬解析

4、PGA回顾

5、重新理解硬解析、软解析和软软解析(用游标的观点)

6、dictionary cache调优目标

7、library cache调优目标

8、避免共享语句无效(invalidations)

9、共享池调整

10、减少共享池碎片的问题

11、sga和pga以及memory_target的大小设置


1、笔记

我们的目标

减少硬解析,减少语句老化。

减少共享池碎片,缓存常用的对象。

2、library cache中sql语句的执行过程

1)sql语句的执行过程:

(1)parse    解析

(2)bind data    绑定数据

(3)execute      执行

(4)fetch   获取

2)

(1)语法分析权限与对象和锁检查

(2)生成hash值

(3)在共享池中检查是否有完全相同的之前完全解析好的(hash值相同)

           如果存在(进一步比较内容是否相同,如果包括大小写等完全相同),

           直接跳过4和5,此时算soft parse软解析。

(4)ORACLE优化器选择最优路径。

(5)产生执行计划,缓存在library cache中。

(6)绑定变量

(7)运行SQL(execute),按照执行计划去读取数据到buffer cache

(8)fetch:server process返回查询信息

3)硬解析。

硬解析即整个SQL语句的执行需要完完全全的解析,生成执行计划。而硬解析,生成执行计划需要耗用CPU资源,

以及SGA资源。在此不得不提的是对库缓存中闩的使用。闩是锁的细化,可以理解为是一种轻量级的串行化设备。当进程申请到闩后,则这些闩用于保护共享内存。

 

3、查看硬解析

两个session一个sys用户,另一个scott用户

1)实验一       --查看文件

(1)SYS用户查看       

SQL> show user

USER is "SYS"

SQL> select sql_text,parse_calls,sql_id from v$sqlarea where sql_text like 'select * from emp where empno=7788';

no rows selected

(2)SCOTT用户进行操作

SQL> conn scott/tiger

SQL> select * from emp where empno=7788;                        --显示一条记录就代表一次硬解析

     EMPNO ENAME      JOB              MGR HIREDATE         SAL       COMM     DEPTNO

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

      7788 SCOTT      ANALYST         7566 19-APR-87       3000                    20

SQL> select * from emp where empno=7900;

     EMPNO ENAME      JOB              MGR HIREDATE         SAL       COMM     DEPTNO

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

      7900 JAMES      CLERK           7698 03-DEC-81        950                    30

(3)SYS用户在查询

SQL> select sql_text,parse_calls,sql_id from v$sqlarea where sql_text like 'select * from emp where empno%';   --硬解析

SQL_TEXT

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

PARSE_CALLS SQL_ID

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

select * from emp where empno=7900

          1 a2ntx1jyj8uur

select * from emp where empno=7788

          1 2cv6qqj01b9wu

2)实验二

(1)在scott用户下创建三个存储过程对比动态sql和绑定变量的sql以及普通的变量

a)ping了一下SQL                 --每次执行都是硬解析,代价很高

create or replace procedure p_1(empno in number)

is

 sql_text varchar2(100);

begin

 sql_text:='select ename from emp where empno='||empno;

 execute immediate sql_text;

end;

/

b)使用绑定变量的方法            --第一次执行时进行硬解析,其他都是软解析或软软解析,只硬解析一次。

create or replace procedure p_2(empno in number)

is

 sql_text varchar2(100);

begin

 sql_text:='select sal from emp where empno=:1';

 execute immediate sql_text using empno;

 end;

/

c)变量的形式           --其实就是绑定变量的方法,只硬解析一次。

create or replace procedure p_3(enum in number)

is

 v_deptno varchar2(30);

begin

 select deptno || 'is 2033' into v_deptno from emp where empno=enum;

 dbms_output.put_line(v_deptno);

end;

/

(2)第一种存储方法测试

a)用SYS用户查询硬解析信息             --没有值

SQL> select sql_text,parse_calls,sql_id from v$sqlarea where sql_text like 'select ename from emp where empno=%';

no rows selected

b)在SCOTT用户下执行存储过程

SQL> exec p_1(7788);

c)用SYS用户查询硬解析信息        --有值了,发现第一种存储方法都是硬解析,代价很高

SQL_TEXT

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

PARSE_CALLS SQL_ID

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

select ename from emp where empno=7788

          1 4b84jg8yc5nwa

(3)第二种存储方法测试

a)用SYS用户查询硬解析信息             --没有值

SQL> select sql_text,parse_calls,sql_id from v$sqlarea where sql_text like 'select sal from emp where empno=%';

no rows selected

b)在SCOTT用户下执行存储过程

SQL> exec p_2(7788);

c)用SYS用户查询硬解析信息        --有值了,但在用别的值进行测试时,只有这一个值,也就是说只解析一次。

SQL> select sql_text,parse_calls,sql_id from v$sqlarea where sql_text like 'select sal from emp where empno=%';

SQL_TEXT

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

PARSE_CALLS SQL_ID

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

select sal from emp where empno=:1

          1 a29ya1gs6s7xq

(4)第三种存储方法测试

a)用SYS用户查询硬解析信息             --没有值

SQL> select sql_text,parse_calls,sql_id from v$sqlarea where sql_text like '%2033%';

no rows selected

b)在SCOTT用户下执行存储过程

SQL> exec p_3(7788);

c)用SYS用户查询硬解析信息        --有值了,但在用别的值进行测试时,只有这一个值,也就是说只解析一次。其实就是用绑定变量的方式。

SQL> select sql_text,parse_calls,sql_id from v$sqlarea where sql_text like '%2033%';

SQL_TEXT

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

PARSE_CALLS SQL_ID

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

SELECT DEPTNO || 'is 2033' FROM EMP WHERE EMPNO=:B1

          2 0g4pdm22kqx2n

4)用statspack发现硬解析                        --查看文档补充

 

4、PGA回顾

1)

(1)SQL> select * from v$pgastat;                --查看PGA信息

(2)SQL> select trunc(pga_target_for_estimate/1024/1024) pga_target,pga_target_factor target_factor,trunc(bytes_processed/1024/1024) bytes_pro,estd_extra_bytes_rw estd_rw,estd_pga_cache_hit_percentage hit_percent,estd_overalloc_count over_count from v$pga_target_advice;

PGA_TARGET TARGET_FACTOR  BYTES_PRO    ESTD_RW HIT_PERCENT OVER_COUNT

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

        10          .125         10          0         100          1

        20           .25         10          0         100          1

        40            .5         10          0         100          1

        60           .75         10          0         100          0

        80             1         10          0         100          0

        96           1.2         10          0         100          0

       112           1.4         10          0         100          0

       128           1.6         10          0         100          0

       144           1.8         10          0         100          0

       160             2         10          0         100          0

       240             3         10          0         100          0

2)父子游标          --就是用来管理子游标的,没有执行计划,不会被T出内存。子游标会被T出内存,被T出内存后可以根据父游标的信息重构子游标,子游标拥有执行计划,不一定共享同样的执行计划

      父游标文本相同的子游标的代表,所有文本相同的游标共享同一个父游标

      子游标包括游标所有相关信息,如具体的执行计划、绑定变量,OBJECT和权限,优化器设置等。子游标随时可以被LRU算法置换出去

       只要你执行SQL语句,ORACLE都会在库缓存中保存一父一子两个游标。如果你执行了文本相同但环境不同因而不能共享执行计划的SQL语句,那么一个父游标可能就对应多个子游标

       父游标没有执行计划,它只有一个信息管理性数据,oracle添加它的目的就是为了管理文本相同的游标,有一个视图是专门针对父游标的,就是V$sqlarea,子游标是v$SQL.

        shared cursor如果library cache中的父游标与子游标能够被共享,此时则为共享游标。V$SQLAREA和V$SQL的列几乎是一模一样的,有一个列是V$SQL中没有的,就是:VERSION_COUNT,它是对应同一父游标的子游标的数量

1)实验一

开三个窗口,分别是sys、tom、scott:

(1)sys用户下,授权

SQL> grant select on scott.emp to tom;

(2)在TOM用户下创建一张表也叫emp;

SQL> create table emp as select * from scott.emp;

(3)在sys用户下

SQL> alter system flush shared_pool;

(4)在tom和scott用户下分别执行                  --不能共享一个执行计划

SQL> select * from emp where empno=7788;

(5)用sys查看

a)

SQL> col sql_text for a14

SQL> select sql_text,sql_id,hash_value,executions exec,loads,version_count,invalidations invalid from v$sqlarea where sql_text like '&text%';                 --查看父游标信息

Enter value for text: select * from emp where empno=7788

SQL_TEXT       SQL_ID        HASH_VALUE       EXEC      LOADS VERSION_COUNT    INVALID

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

select * from  2cv6qqj01b9wu 1075160986          2          2             2          0

emp where empn

o=7788

          当子游标被踢出Library cache时,oracle可以利用父游标的信息重新构建出一个子游标来,这个过程叫reload。

b)

SQL> select sql_id,child_number,sql_text,optimizer_mode,plan_hash_value,child_address,executions,loads from v$sql where sql_id='2cv6qqj01b9wu';           --查询子游标信息,两个不同的执行计划,两个不同 的子游标

SQL_ID        CHILD_NUMBER SQL_TEXT       OPTIMIZER_ PLAN_HASH_VALUE CHILD_AD EXECUTIONS      LOADS

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

2cv6qqj01b9wu            0 select * from  ALL_ROWS        2949544139 38B50B70          1          1

                           emp where empn

                           o=7788

2cv6qqj01b9wu            1 select * from  ALL_ROWS        3956160932 388F2E9C          1          1

                           emp where empn

                           o=7788

(5)将子游标踢出Library cache

SQL> analyze table scott.emp compute statistics;               --分析,获取最新数据,使一些执行计划失效,下次执行时需要硬解析,重新生成执行计划

在tom和scott用户中在执行一次查看操作:

SQL> select * from emp where empno=7788;

(6)重新查看父子游标

a)

SQL> select sql_text,sql_id,hash_value,executions exec,loads,version_count,invalidations invalid from v$sqlarea where sql_text like '&text%';           --查看父游标

Enter value for text: select * from emp where empno=7788

SQL_TEXT       SQL_ID        HASH_VALUE       EXEC      LOADS VERSION_COUNT    INVALID     --失效

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

select * from  2cv6qqj01b9wu 1075160986          3          3             2          1

emp where empn

o=7788

b)

SQL> select sql_id,child_number,sql_text,optimizer_mode,plan_hash_value,child_address,executions,loads from v$sql where sql_id='2cv6qqj01b9wu';                       --查看子游标,子游标重构,硬解析

SQL_ID        CHILD_NUMBER SQL_TEXT       OPTIMIZER_ PLAN_HASH_VALUE CHILD_AD EXECUTIONS      LOADS

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

2cv6qqj01b9wu            0 select * from  ALL_ROWS        2949544139 38B50B70          1          2

                           emp where empn

                           o=7788

2cv6qqj01b9wu            1 select * from  ALL_ROWS        3956160932 388F2E9C          2          1

                           emp where empn

                           o=7788

2)什么情况下不共享子游标,共享父游标?

(1)同一句话由不同的用户执行,执行计划也不同。

(2)搜集统计信息analyze table导致子游标失效,reload。

3)什么情况下共享子游标,不共享父游标?

Select empno,ename,sal from scott.emp where empno=7788;

Select empno,ename,sal from scott.emp where empno=7369;

Select empno,ename,sal from scott.emp where empno=7839;

语句相似,执行计划相同,但语句稍有不同。

解决方法:

(1)此时最好用绑定变量共享父游标。

(2)alter system set cursor_sharing=force | similar:逼不得已不用(有bug)。

force比similar好一些。

SQL> show parameter cursor;

NAME                                 TYPE        VALUE

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

cursor_sharing                       string      EXACT

cursor_space_for_time                boolean     FALSE

open_cursors                         integer     50

session_cached_cursors               integer     20

SQL> alter system set cursor_sharing=force;               --设为force,应急用的。

SQL> alter system set cursor_sharing=exact;               --改回来,exact表示精确匹配

 

 

5、重新理解硬解析、软解析和软软解析(用游标的观点):

硬解析:匹配语句(解析),没命中,构造一个新的子游标(执行计划)。

软解析:匹配语句(解析),命中,打开已有的子游标(执行计划),用完关闭。

软软解析:不匹配(hash一下而已):                     --影响它的参数有:打开的子游标数、执行过三次的子游标数

         如果在uga中发现有对应的打开的子游标,直接找到执行计划。

         没打开的,找uga中缓存的三次关闭(执行)过的子游标信息(执行过三次的子游标),如果有,直接找到执行计划。

Session cursor cache,中文描述就是有一块内存区域,用来存储关闭了的cursor。当一个cursor关闭之后,orcale会检查这个cursor的request次数是否超过3次,如果超过了三次,就会放入session cursor cache,这样在下次parse的时候,就可以从session cursor cache中找到这个statement,session cursor cache的管理也是使用LRU

 

SQL> show parameter cursor;

NAME                                 TYPE        VALUE

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

cursor_sharing                       string      EXACT

cursor_space_for_time                boolean     FALSE

open_cursors                         integer     50                              --能打开的最大游标数

session_cached_cursors               integer     20                               --缓存执行过三次的子游标数,这个值为20,oracle就会保留最近20条语句,不用解析了(跳过解析)。11g是50,。Grid安装时这个值设为200.

这两个参数越大,越可能走软软解析,但消耗越大的内存,所以不是越大越好,并且是静态参数,不能直接修改。

专用服务连接使用PGA进行排序

共享服务器连接使用共享池进行排序

1)修改session_cached_cursors的值后,会发现hits/total的值会增大。

SQL> select name,value from v$sysstat where name like '%cursor%';

NAME                                                                  VALUE

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

opened cursors cumulative                                             19764

opened cursors current                                                   36

session cursor cache hits                                             15913

session cursor cache count                                              421

cursor authentications                                                  431

SQL> select name,value from v$sysstat where name like '%parse%';

NAME                                                                  VALUE

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

parse time cpu                                                          158

parse time elapsed                                                      660

parse count (total)                                                    9325

parse count (hard)                                                     1615

parse count (failures)                                                    8

session cursor cache hits 就是系统在高速缓存区中找到相应cursors的次数,parse count(total)就是总的解析次数,二者比值越高,性能越好。如果比例比较低,并且有较多剩余内存的话,可以考虑加大改参数如果比例较低,就考虑增大session_cached_cursors。

2)修改session_cached_cursors的值                                                   --此处可以不修改,只是提供修改方法

(1)SQL> show parameter spfile;              --用spfile启动

NAME                                 TYPE        VALUE

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

spfile                               string      /u01/app/oracle/product/10.2.0

                                                 /db_1/dbs/spfilePROD.ora

(2)[oracle@gc1 ~]$ cd $ORACLE_HOME/dbs

(3)[oracle@gc1 dbs]$ ls

hc_PROD.dat  initdw.ora  init.ora  initPROD.ora  lkPROD  orapwPROD  spfilePROD.ora  sqlnet.log

(4)[oracle@gc1 dbs]$ vi spfilePROD.ora                         --添加如下信息

PROD.__session_cached_cursors=100                           

(5)SQL> startup

(6)SQL> show parameter session

NAME                                 TYPE        VALUE

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

java_max_sessionspace_size           integer     0

java_soft_sessionspace_limit         integer     0

license_max_sessions                 integer     0

license_sessions_warning             integer     0

logmnr_max_persistent_sessions       integer     1

session_cached_cursors               integer     100

session_max_open_files               integer     10

sessions                             integer     300

shared_server_sessions               integer     200

 

6、dictionary cache调优目标

1)调整参数                    --当常用对象和整体未命中率超过2%和15%时,可以调整share pool的大小

减少读取目标在cache未命中的比率(miss)

在dictionary cache数据以行的方式存放,所以dictionary cache也叫row cache

对常用对象,未命中率应该小于2%

SQL> select parameter,gets,getmisses,round((getmisses/gets*100),2) "Misses %" from v$rowcache where parameter like '%objects%';                --常用对象未命中率超过2%

PARAMETER                              GETS  GETMISSES   Misses %

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

dc_objects                             2727        380      13.93

对于整体,未命中率应该小于15%,否则考虑增加share pool的大小

SQL> select sum(gets),sum(getmisses),round((sum(getmisses)/sum(gets)*100),2) "Misses %" from v$rowcache;               --整体未命中率超过15%

 SUM(GETS) SUM(GETMISSES)   Misses %

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

     21671           3547      16.37

 

7、library cache调优目标

1)让大部分执行过的sql和plsql语句都能共享,提高命中率,减少语句的再次解析的次数(硬解析),共享执行计划。

(1)保证用户执行的语句可以被共享(在oltp的库中,尽量使用绑定变量

(2)有足够的空间保证语句的共享

2)调整参数

下述语句可以查看库缓存的空闲空间:

SQL> select pool,name,trunc(bytes/1024/1024,2) free_space from v$sgastat where pool ='shared pool' and name like '%free memory%';

POOL         NAME                       FREE_SPACE

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

shared pool  free memory                      34.9

 

8、避免共享语句无效(invalidations)

       如果对象结构发生变化被重新分析过,那么跟这个对象相关的sql语句的执行计划将被标示为invalidation,会导致重新解析,因为表分析过后,有关这个表的统计信息被更新,oracle优化器会根据新的统计信息去选择最佳路径,所以要产生新的执行计划。

       对表的分析无需频繁,只是在表结构和字段上的数据发生严重变化的时候,再做表分析

1)SQL> select namespace,gethitratio,pinhitratio,reloads,invalidations from v$librarycache;

NAMESPACE       GETHITRATIO PINHITRATIO    RELOADS INVALIDATIONS

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

SQL AREA         .393830703  .925855272        646             0

TABLE/PROCEDURE  .490648743  .587578195        833             0

BODY                 .53125   .81097561         15             0

TRIGGER                   1           1          0             0

INDEX            .512820513  .042016807         57             0

CLUSTER          .911111111   .95951417          2             0

OBJECT                    1           1          0             0

PIPE                      1           1          0             0

JAVA SOURCE               1           1          0             0

JAVA RESOURCE             1           1          0             0

JAVA DATA                 1           1          0             0

GETHITRATIO代表解析阶段的命中率

PINHITRATIO代表fetch阶段的命中率

2)SQL> analyze table scott.emp estimate statistics;

3)SQL> select namespace,gethitratio,pinhitratio,reloads,invalidations from v$librarycache;  --分析完后,invalidations数值增加,reloads增加,需要重新硬解析

NAMESPACE       GETHITRATIO PINHITRATIO    RELOADS INVALIDATIONS

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

SQL AREA         .389361702  .925215446        665             1

TABLE/PROCEDURE  .491712707  .589695705        844             0

BODY                 .53125  .827777778         15             0

TRIGGER                   1           1          0             0

INDEX            .512820513  .042016807         57             0

CLUSTER          .913043478  .962121212          2             0

OBJECT                    1           1          0             0

PIPE                      1           1          0             0

JAVA SOURCE               1           1          0             0

JAVA RESOURCE             1           1          0             0

JAVA DATA                 1           1          0             0

 

9、共享池调整

1)共享池调整的目标:

减少硬解析,减少语句老化。

减少共享池碎片,缓存常用的对象。

2)减少硬解析

(1)SQL语句变形得规范

(2)尽量使用绑定变量

(3)设置cursor_sharing的值为similar或者force(优先用force)

          第三个方法的使用条件:如果应用程序改动量很大,或很难修改,可以暂时设置,这就相当于是把数据库灌醉,看谁都长的很像,但是也会有副作用,不是根本解决问题的方法。

Cursor_sharing=force | similar ,该参数默认值为exact。但该参数设置为similar时,存在bug,可能导致执行计划的不优。

sga的回顾讲的是如何发现硬解析,pga的回顾讲的是怎么减少软解析,走不解析。

分析显示有应用没有使用绑定变量,共享池有栓冲突,减少共享池使用量的最好的方式是什么。

3)减少语句老化

衡量标准:

(1)reload率(reload的次数/执行的次数)小于1%

在稳定运行的oracle db中,reload的比率应该低于1%

例:

在insert过程不使用绑定变量,语句被解析10万次,执行10万次。

导致gethitratio在解析过程中命中的比率下降

导致pinhitratio在执行中过的命中率下降

gets的次数增加了10次以上

否则增大共享池尺寸。

 

10、减少共享池碎片的问题

表空间的创建uniform模式比增长模式更能减少碎片。

1)为大对象分配所需的保留空间

(1)SQL> show parameter shared;

NAME                                 TYPE        VALUE

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

hi_shared_memory_address             integer     0

max_shared_servers                   integer     30

shared_memory_address                integer     0

shared_pool_reserved_size            big integer 5M                    --这个参数就是为大对象所预留的

shared_pool_size                     big integer 0

shared_server_sessions               integer     200

shared_servers                       integer     10

(2)SQL> select name,bytes/1024/1024 m from v$sgainfo;

NAME                                      M

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

Fixed SGA Size                   1.16325378

Redo Buffers                      2.8359375

Buffer Cache Size                       252

Shared Pool Size                        100               --总大小100M

Large Pool Size                          40

Java Pool Size                            4

Streams Pool Size                         0

Granule Size                              4

Maximum SGA Size                        400

Startup overhead in Shared Pool          40

Free SGA Memory Available                 0

当一些大的对象需要分配连续的大的空间时,oracle可以用保留池来存放这些对象的语句代码和解析信息。

保留池的大小一般在share pool size 的10-50%

通过设置shared_pool_reserved_size来实现,最大不能超过共享池尺寸的50%。

查询V$shared_pool_reserved可以查看保留区域的尺寸是否合适;

(3)SQL> select free_space,request_misses,request_failures from v$shared_pool_reserved;

FREE_SPACE REQUEST_MISSES REQUEST_FAILURES

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

   4044872              0                0

misses这一行表示找不到内存块了,然后从LRU队列中清除对象供自己用。

failures这一行只是说找不到内存来满足请求

(4)SQL> select (request_misses/(requests+0.0001))*100 "REQUEST MISSES RATIO",(request_failures/(requests+0.0001))*100 "REQUEST FAILURES RATIO" from v$shared_pool_reserved;

REQUEST MISSES RATIO REQUEST FAILURES RATIO

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

                   0                      0

应该都要小于1%,如果大于1%,应该加大SHARED_POOL_RESERVED_SIZE.

2)将经常调用的大对象保留在共享池中

建立视图,显示在缓存中的大于50K的procedure function packagetrigger.

(1)查询

SQL> col name for a50

SQL>

select name,sharable_mem,type

from v$db_object_cache

where sharable_mem>50000

and type in ('PACKAGE','PACKAGE BODY','FUNCTION','PROCEDURE','TRIGGER')

and kept='NO';

 

NAME                                               SHARABLE_MEM TYPE

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

DBMS_BACKUP_RESTORE                                       95559 PACKAGE BODY

PRVT_ADVISOR                                              66780 PACKAGE BODY

STANDARD                                                 438620 PACKAGE

DBMS_RCVMAN                                              375723 PACKAGE BODY

 

(3)某个存储过程经常要执行,将其缓存到共享池

SQL> exec dbms_shared_pool.keep('SYS.STANDARD');           --执行一个包即可,有可能会报错,需要执行一个脚本SQL> @?/rdbms/admin/dbmspool;

(4)在查询                    --发现没有STANDARD那个包了

SQL>

select name,sharable_mem,type

from v$db_object_cache

where sharable_mem>50000

and type in ('PACKAGE','PACKAGE BODY','FUNCTION','PROCEDURE','TRIGGER')

and kept='NO';

 

NAME                                               SHARABLE_MEM TYPE

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

DBMS_BACKUP_RESTORE                                       95559 PACKAGE BODY

PRVT_ADVISOR                                              66780 PACKAGE BODY

DBMS_RCVMAN                                              375723 PACKAGE BODY

3)移除大的匿名块

      如果有大的匿名块,可以把它转变为存储过程。在plsql的代码中不要使用大的匿名块,可以用存储过程、函数或更小的匿名块代替。

4)为ORACLE共享服务连接设置大池

UGA在共享模式,而且没有配置large pool时会占用shared_pool空间。

1)分配大池可以减少UGA对shared_pool的占用。

(1)当server process是专有模式,UGA在PGA中分配

(2)当server process是share模式,默认在share pool分配;如启用了large pool,则在large pool分配

2)大池的作用:

(1)在server process是共享模式时,分配uga空间

(2)并行操作或批处理

(3)备份恢复及rman备份恢复,以及数据的复制

(4)启动server process异步I/O(dbwr_io_slaves)

不设大池就占用共享池。

large pool:没有大池就会使用共享池,主要用途是供共享的服务器进程使用。对备份恢复至关重要。一般来说100M就可以了。

 

11、sga和pga以及memory_target的大小设置

      如果库是你建的,你可以采纳这些建议,如果不是你建的,你只能对库的参数进行调整了。

Oltp

     如果是10g

              sga_target=(物理内存*0.8)*0.8=物理内存*0.64

              sga_max_size=sga_target

      pga_aggregate_target=(物理内存*0.8)*0.2=sga_target/4

   如果是11g

      那就设置memory_target=(物理内存*0.8)=物理内存*0.8就行了

              memory_target这个参数不是瞎设的,不能大于/dev/shm

[oracle@gc1 ~]$ df -k /dev/shm

Filesystem           1K-blocks      Used Available Use% Mounted on

tmpfs                  1037748         0   1037748   0% /dev/shm

例如:内存4g,sga_target=4*0.64=2.56g

Pga_aggregate_target=0.64g,memory_target=3.2g

Olap

   如果是10g

      sga_tartget=(物理内存*0.8)*0.5=物理内存*0.4

      sga_max_size=sga_target

      pga_aggregate_target=sga_target

   如果是11g

      那就设置memory_target=(物理内存*0.8)=物理内存*0.8就行了。

              memory_target这个参数不是瞎设的,不能大于/dev/shm

[oracle@gc1 ~]$ df -k /dev/shm

Filesystem           1K-blocks      Used Available Use% Mounted on

tmpfs                  1037748         0   1037748   0% /dev/shm

例如:内存4g,sga_target=4*04=1.6g

Pga_aggregate_target=1.6g,memory_target=3.2g

1)Root用户执行:

修改/etc/fstab的这行:默认的:

(1)[root@gc1 ~]# df -h                 --查看tmpfs的大小

Filesystem            Size  Used Avail Use% Mounted on

/dev/mapper/VolGroup00-LogVol00

                       35G   11G   23G  32% /

/dev/sda1              99M   12M   82M  13% /boot

tmpfs                1014M     0 1014M   0% /dev/shm                --共享临时文件,在内存中的,在10g中sga的值不能比这个值大,11g中memory的值不能比这个值大,如果大于可能报错

(2)调整tmpfs的大小

[root@gc1 ~]# vi /etc/fstab                               --将tmpfs调为1200M

/dev/VolGroup00/LogVol00 /                       ext3    defaults        1 1

LABEL=/boot             /boot                   ext3    defaults        1 2

tmpfs                   /dev/shm                tmpfs   defaults,size=1200m        0 0

devpts                  /dev/pts                devpts  gid=5,mode=620  0 0

sysfs                   /sys                    sysfs   defaults        0 0

proc                    /proc                   proc    defaults        0 0

/dev/VolGroup00/LogVol01 swap                    swap    defaults        0 0

(3)重新挂载一下

[root@gc1 ~]# mount -o remount /dev/shm

(4)查询大小

[root@gc1 ~]# df -h

Filesystem            Size  Used Avail Use% Mounted on

/dev/mapper/VolGroup00-LogVol00

                       35G   11G   23G  32% /

/dev/sda1              99M   12M   82M  13% /boot

tmpfs                 1.2G     0  1.2G   0% /dev/shm

 

你可能感兴趣的:(Oracle,设置共享池,Oracle)