目录
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)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资源。在此不得不提的是对库缓存中闩的使用。闩是锁的细化,可以理解为是一种轻量级的串行化设备。当进程申请到闩后,则这些闩用于保护共享内存。
两个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发现硬解析 --查看文档补充
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表示精确匹配
硬解析:匹配语句(解析),没命中,构造一个新的子游标(执行计划)。
软解析:匹配语句(解析),命中,打开已有的子游标(执行计划),用完关闭。
软软解析:不匹配(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
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
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
如果对象结构发生变化被重新分析过,那么跟这个对象相关的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
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次以上
否则增大共享池尺寸。
表空间的创建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就可以了。
如果库是你建的,你可以采纳这些建议,如果不是你建的,你只能对库的参数进行调整了。
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