一、Oracle体系结构概述
数据库--驻留在磁盘上的--各种磁盘文件(数据文件、控制文件、日志文件)实例--驻留在内存--内存组件+进程---------------一旦数据库关闭,不存在了数据库和实例的关系A 一个数据库对一个实例(单节点) 数据库--实例B 一个数据库对N个实例(多节点)--防止单点故障(oracle高可用架构)--7*24的系统 实例1 实例2 实例3 。。。 实例n ----每个实例都独立安装在独自的虚拟机上 | | | | ------------------------------------- | 数据库:数据文件(共享存储) 服务器:tgtd服务(管理共享存储):客户端(实例)--iscsi服务扫描到共享存储磁盘 故障切换依赖的技术原理是SSH互信服务。DSA RSA秘钥建立互信。 一个实例就是一个虚拟机节点。每个实例创建至少一个监听器。 其中一个节点宕机后,oracle可以进行透明故障切换,例如当实例2宕机后,可以平滑的切换到其他实例。 上述结构为oracle RAC ,实例1到n负载均衡的结构。实例--内存组件+后台进程oracle内存组件SQL> show sgaTotal System Global Area 608174080 bytesFixed Size 1268920 bytesVariable Size 230687560 bytesDatabase Buffers 373293056 bytesRedo Buffers 2924544 bytes后台进程[oracle@oracle3 ~]$ ps -ef|grep ora_ 红色标志为5个必要进程,其它为非必要进程oracle 2548 1 0 08:54 ? 00:00:00 ora_pmon_ORCLoracle 2550 1 0 08:54 ? 00:00:00 ora_psp0_ORCLoracle 2552 1 0 08:54 ? 00:00:00 ora_mman_ORCLoracle 2554 1 0 08:54 ? 00:00:00 ora_dbw0_ORCLoracle 2556 1 0 08:54 ? 00:00:00 ora_lgwr_ORCLoracle 2558 1 0 08:54 ? 00:00:00 ora_ckpt_ORCLoracle 2560 1 0 08:54 ? 00:00:00 ora_smon_ORCLoracle 2562 1 0 08:54 ? 00:00:00 ora_reco_ORCLoracle 2564 1 0 08:54 ? 00:00:00 ora_cjq0_ORCLoracle 2566 1 0 08:54 ? 00:00:00 ora_mmon_ORCLoracle 2568 1 0 08:54 ? 00:00:00 ora_mmnl_ORCLoracle 2570 1 0 08:54 ? 00:00:00 ora_d000_ORCLoracle 2572 1 0 08:54 ? 00:00:00 ora_s000_ORCLoracle 2576 1 0 08:54 ? 00:00:00 ora_qmnc_ORCLoracle 2768 1 0 08:54 ? 00:00:00 ora_j000_ORCLoracle 2791 1 0 08:54 ? 00:00:00 ora_q000_ORCLoracle 2793 1 0 08:54 ? 00:00:00 ora_q001_ORCLORCL和LAW实例是没有任何关系的:ORCL的数据文件是自己的,LAW数据文件是自己的,ORCL和LAW各自有自己的内存组件和后台进程。 一台设备(一个虚拟机节点)上共用一个监听器 --------------------------------- | | --在本地磁盘即可实现,不需要共享存储。 ORCL(数据库+实例) LAW(数据库+实例) --RDBMS(关系型数据库管理系统) | | ------------------------------------------- | DBMS(数据库管理系统--oracle软件) 单节点环境下关机,关掉全部数据库,集群环境下,关机命令可以只关掉一个实例。---------------------------------------------------------------------------------------------------------------- PGA(程序全局区或者进程全局区) 内存 实例|----SGA(系统全局区)+ 后台进程(SMON DBWn PMON LGWR CKPT) ========================================================================== 磁盘 数据库--- 数据文件 控制文件 redo日志文件 数据外部文件--归档日志文件、参数文件、密码文件[oracle@oracle3 oradata]$ cd ORCL[oracle@oracle3 ORCL]$ ll总计 2778708-rw-r----- 1 oracle oinstall 7061504 06-24 10:25 control01.ctl --控制文件-rw-r----- 1 oracle oinstall 7061504 06-24 10:25 control02.ctl-rw-r----- 1 oracle oinstall 7061504 06-24 10:25 control03.ctl-rw-r----- 1 oracle oinstall 104865792 06-24 10:22 example01.dbf --数据文件-rw-r----- 1 oracle oinstall 1073750016 06-24 10:22 plsql01.dbf-rw-r----- 1 oracle oinstall 52429312 06-24 10:22 redo01.log --redo日志文件-rw-r----- 1 oracle oinstall 52429312 06-24 10:22 redo02.log-rw-r----- 1 oracle oinstall 52429312 06-24 10:25 redo03.log-rw-r----- 1 oracle oinstall 356524032 06-24 10:22 sysaux01.dbf-rw-r----- 1 oracle oinstall 545267712 06-24 10:22 system01.dbf-rw-r----- 1 oracle oinstall 31465472 06-17 00:00 temp01.dbf-rw-r----- 1 oracle oinstall 560996352 06-24 10:22 undotbs01.dbf-rw-r----- 1 oracle oinstall 5251072 06-24 10:22 users01.dbf[oracle@oracle3 dbs]$ ll总计 68-rw-r--r-- 1 oracle oinstall 1001 06-09 12:00 initORCL.ora --pfile文件-rw-r----- 1 oracle oinstall 1536 06-16 15:07 orapwLAW --密码文件-rw-r----- 1 oracle oinstall 1536 06-09 15:57 orapwORCL-rw-r----- 1 oracle oinstall 2560 06-16 15:07 spfileLAW.ora --spfile文件-rw-r----- 1 oracle oinstall 3584 06-24 10:22 spfileORCL.ora归档文件在没有打开归档之前是看不到的。SGA(system global area) 系统全局区--不是操作系统,指Oracle软件这个系统PGA(progamme global area) 二、SGA详解1、SGA的全局分析SQL> conn /as sysdbaConnected.SQL> show sgaTotal System Global Area 608174080 bytes --580M,内存中分出580M让SGA使用 -----------------------------------------------------------Fixed Size 1268920 bytesVariable Size 230687560 bytesDatabase Buffers 373293056 bytesRedo Buffers 2924544 bytes------------------------------------------------------------SQL> select 608174080/1024/1024 from dual;608174080/1024/1024------------------- 580SQL> show parameter sga_max_sizeNAME TYPE VALUE------------------------------------ ----------- ------------------------------sga_max_size big integer 580M --SGA控制参数一个节点一般只会放一个数据库的。如果这个节点仅仅就是数据库服务器,其他服务没有,可以将SGA增大到物理内存的50%~60%。SQL> show parameter sga_targetNAME TYPE VALUE------------------------------------ ----------- ------------------------------sga_target big integer 580M --SGA目标参数,实际上还兼有SGA自动管理开关的功能。 不为0,则表示自动管理,为0手动管理。实操案例:调整SGA大小oracle建议:sga_max_size = sga_target SGA参数是静态参数,需要重启才能生效。sga_max_size >= sga_targetSQL> alter system set sga_max_size=1024M scope=spfile;System altered.SQL> show parameter sga_max_sizeNAME TYPE VALUE------------------------------------ ----------- ------------------------------sga_max_size big integer 580MSQL> shutdown immediateDatabase closed.Database dismounted.ORACLE instance shut down.SQL> startupORACLE instance started.Total System Global Area 1073741824 bytesFixed Size 1271616 bytesVariable Size 696256704 bytesDatabase Buffers 373293056 bytesRedo Buffers 2920448 bytesDatabase mounted.Database opened.SQL> show parameter sga_max_sizeNAME TYPE VALUE------------------------------------ ----------- ------------------------------sga_max_size big integer 1GSQL> alter system set sga_target=1G scope=both; --再去修改SGA目标参数System altered.SQL> show parameter sga_targetNAME TYPE VALUE------------------------------------ ----------- ------------------------------sga_target big integer 1G注意:必须先修改max参数再去修改target参数Metalink --Oracle官方论坛,发布问题,浏览,oracle工程师帮你解决。但是必须是购买过Oracle的产品或者服务才能有这个账号的。淘宝上可以租,1年费用。如果没有给Oracle缴费的话,只能是浏览不能发帖。###########################################################################################
2、SGA内组件分析Java pool + Large pool + shared pool + stream pool + db buffer cache + redo log bufferJava池 大池 共享池 流池 高速缓冲区 重做日志缓冲区参数:SQL> show parameter java_poolNAME TYPE VALUE------------------------------------ ----------- ------------------------------java_pool_size big integer 0共享池---库高速缓存区+数据字典高速缓存区SQL> show parameter large_poolNAME TYPE VALUE------------------------------------ ----------- ------------------------------large_pool_size big integer 0SQL> show parameter sharedNAME TYPE VALUE------------------------------------ ----------- ------------------------------shared_pool_size big integer 0SQL> show parameter streamNAME TYPE VALUE------------------------------------ ----------- ------------------------------streams_pool_size big integer 0SQL> show parameter db_cache_sizeNAME TYPE VALUE------------------------------------ ----------- ------------------------------db_cache_size big integer 0SQL> show parameter log_bufferNAME TYPE VALUE------------------------------------ ----------- ------------------------------log_buffer integer 2875392pfile文件:ORCL.__db_cache_size=838860800ORCL.__java_pool_size=33554432ORCL.__large_pool_size=4194304ORCL.__shared_pool_size=192937984ORCL.__streams_pool_size=0 --发现这个地方有值SGA自动管理方式:9i之前用的是SGA手工管理方式:5个参数需要根据监控结果手工区调整值的,维护比较麻烦。10g开始SGA用自动管理方式,将复杂的功能进行封装。体现:1、参数值全部为0 2、通过sga_target参数控制开关。5个组件大小依靠Oracle根据负载量自己去调整,无需人为干预。参数文件中看到的值就是当前数据库稳定之后oracle自己调整的值。如果关机下次启动的时候按照这个稳定的值大小分配。sga_target>=0 表示自动管理方式sga_target=0 手工管理方式log_buffer --日志缓冲区是不受SGA自动管理约束的。手工管理的。-----------------------------------------------------------------------------------oralce参数的个数:select * from v$parameter --259个参数文件中显示的参数:1、开机必须要读取到的参数 2、非缺省值参数--就是改过默认值的参数除外其他得到参数不会显示在参数文件里面,所以参数文件中的参数小于259个SQL> show sgaTotal System Global Area 1073741824 bytes --SGA总大小1GB------------------------------------------------Fixed Size 1271616 bytes --固定区域大小,空池,自启区Variable Size 230688960 bytes --可变区域大小Database Buffers 838860800 bytes --数据库高速缓冲区db_cache_sizeRedo Buffers 2920448 bytes --日志缓冲区大小----------------------------------------Variable Size = shared_pool_size + java_pool_size + streams_pool_size + large_pool_size + free memoryoverhead(SGA的头部)包含在shared_pool_size中SQL> col name format a30 --完整显示结果SQL> select * from v$sgainfo; --sga的详细信息NAME BYTES RESIZEABLE------------------------------ ---------- ---Fixed SGA Size 1271616 NoRedo Buffers 2920448 NoBuffer Cache Size 838860800 Yes == Database BuffersShared Pool Size 192937984 YesLarge Pool Size 4194304 YesJava Pool Size 33554432 YesStreams Pool Size 0 Yes --RESIZEABLE是YES的 SGA自动管理范畴Granule Size 4194304 No --颗粒数大小Maximum SGA Size 1073741824 No --SGA最大值Startup overhead in Shared Pool 46137344 No --overheadFree SGA Memory Available 0 --空闲区域大小11 rows selected.SQL> select (192937984+33554432+0+4194304+0) from dual;(192937984+33554432+0+4194304+0)-------------------------------- 230686720 230688960 --可变区域,有误差,但是数量级是不会变化的Java池--oracle的程序中有纯JAVA编写的要用到JVM环境,java程序用到的内存区域大池--1、共享服务器模式(创建数据库的时候选择的) 2、rman备份用Shared Pool Size--分为两个区域:库缓存(library cache)+ 数据字典高速缓存(data dictionary cahce) 库缓存:SQL语句、SQL语句解析结果、PLSQL程序代码、共享游标 数据字典高速缓存:关于数据字典缓存信息:字段、对象状态、对象权限Streams Pool ----oracle stream赋复制开启的时候使用。Buffer Cache Size ----SGA中最大的区域,读取到内存中的数据库块的共享区域########################################################################################### 2、PGA--程序全局区分为两个部分:1、用户进程使用的区域(工作区)--user访问Oracle Server的时候在本地客户端产生users processes,通过网络找到Oracle Server的监听器,然后访问数据库,在数据库的PGA区域产生对应的server进程,而且是1对1的关系,创建数据库是专有模式,ueser processes和server processes通信,server processes通过SGA和数据库文件进行IO操作。PGA除了三种运算耗用空间外,还有空间要驻留server processes进程,叫工作区workarea_size_policy --工作区大小策略2、内存区:排序区(order by,冒泡排序法空间复杂度,需要这样的空间支撑这个算法--sort_area_size) 哈希区(计算两表连接的时候用到的hash join算法的空间,通过hash函数来分簇) 位图合并区(位图运算的时候使用区域,二进制码,与或运算的,where A and B or C)当参与运算的数据量很大的时候,PGA不够用了,oralce会临时借用磁盘上临时表空间TEMP来完成这个运算的。/u01/oracle/oradata/ORCL/temp01.dbf -- TEMPSQL> show parameter sort --排序区,SQL语句中的order by和group by涉及到排序操作的区域 --order by 用的是冒泡排序法,在底层需要内存空间还进行冒泡排序NAME TYPE VALUE------------------------------------ ----------- ------------------------------sort_area_size integer 65536 --有值,但是oracle会自己调整,自动管理方式SQL> show parameter hash --哈希运算区域,表的关联的时候用HASH JOIN算法实现,用到这个区域NAME TYPE VALUE------------------------------------ ----------- ------------------------------hash_area_size integer 131072 --有值,但是oracle会自己调整,自动管理方式SQL> show parameter bitmap --位图合并区,用作位图运算,尤其是位图索引的连接NAME TYPE VALUE------------------------------------ ----------- ------------------------------bitmap_merge_area_size integer 1048576 --有值,但是oracle会自己调整,自动管理方式PGA参数:SQL> show parameter pgaNAME TYPE VALUE------------------------------------ ----------- ------------------------------pga_aggregate_target big integer 192M调整参数:SQL> alter system set pga_aggregate_target=300M scope=both; System altered.SQL> show parameter pgaNAME TYPE VALUE------------------------------------ ----------- ------------------------------pga_aggregate_target big integer 300M --建议初始化下先给200~300M,需要时慢慢加PGA+SGA=1324M 物理内存是2G,目前是没有超出范围的。PGA的自动管理方式:SQL> show parameter workNAME TYPE VALUE------------------------------------ ----------- ------------------------------workarea_size_policy string AUTO --MANUL为手工管理方式。1、自动调节排序、哈希、位图区域的大小2、自动调节每个server进程占用的内存空间。PGA大小不是占有式的,SGA是占有式的,分配超过物理内存会报错的。但是PGA不是SQL> alter system set pga_aggregate_target=300G scope=both;System altered. --策略式参数,这个值是个最大值,用多少算多少。不建议超过物理内存,否则会不可控。SQL> alter system set pga_aggregate_target=300M scope=both;System altered.########################################################################################### 3、颗粒数(granule):Granule Size = 4194304 --4M内存分配是最小4M分配的,不是1个字节。SGA小于等于1GB的时候,颗粒大小是4M,大于1GB的时候,颗粒大小事16MSQL> alter system set sga_max_size=1200M scope=spfile; System altered.SQL> startup forceORACLE instance started.Total System Global Area 1258291200 bytesFixed Size 1267260 bytesVariable Size 469764548 bytesDatabase Buffers 771751936 bytesRedo Buffers 15507456 bytesDatabase mounted.Database opened.SQL> alter system set sga_target=1200M scope=both; System altered.SQL> select * from v$sgainfo;NAME BYTES RES------------------------------ ---------- ---Fixed SGA Size 1267260 NoRedo Buffers 15507456 NoBuffer Cache Size 956301312 YesShared Pool Size 251658240 YesLarge Pool Size 16777216 YesJava Pool Size 16777216 YesStreams Pool Size 0 YesGranule Size 16777216 No --颗粒数Maximum SGA Size 1258291200 NoStartup overhead in Shared Pool 50331648 NoFree SGA Memory Available 011 rows selected.---------------------------------------------------------------SQL> desc v$sga_dynamic_components; --看到数据库上所有可能出现的内存组件的变化和颗粒数 Name Null? Type ----------------------------------------- -------- ---------------------------- COMPONENT VARCHAR2(64) --组件的名称 CURRENT_SIZE NUMBER --组件当前大小 MIN_SIZE NUMBER --组件最小值 MAX_SIZE NUMBER --最大值 USER_SPECIFIED_SIZE NUMBER --用户给参数的赋值 OPER_COUNT NUMBER --实例打开后被数据库调整大小的次数 LAST_OPER_TYPE VARCHAR2(13) --表示组件最后一次被操作的类型:GROW 增加 SHRINK 减少过 STATIC 静态的 LAST_OPER_MODE VARCHAR2(9) --最后一次操作的模式:MANUAL手工 IMMEDIATE 自动 LAST_OPER_TIME DATE --最后一次操作时间 GRANULE_SIZE NUMBER --颗粒大小这个视图中没有log buffer这个区域的操作记录,这个区域颗粒大小不是16M。log buffer--不是自动管理的范畴log buffer--缓存是即将写入日志文件日志条目。这个区域调整大小时候必须换成字节单位。SQL> alter system set log_buffer=30M scope=spfile;alter system set log_buffer=30M scope=spfile *ERROR at line 1:ORA-02095: specified initialization parameter cannot be modified -- 必须换成字节才可以调SQL> alter system set log_buffer=30000000 scope=spfile;System altered.########################################################################################### 4、数据库高速缓冲区的组件Buffer Cache Size--SGA中最大的区域。当前956301312字节SQL> show parameter db_cache_size --受控参数NAME TYPE VALUE------------------------------------ ----------- ------------------------------db_cache_size big integer 0 LRU算法来获取的 ----------------------------------------链表(数据结构)--节点的移动不是在物理上移动的,而是修改节点的前驱指针和后继指针 头部--------------------================尾部 1、被查询到的数据块会放在LRU链表的尾部。 2、如果这个块被查询到的次数越多,出现在LRU链表的尾部的机会越大。 3、查询数据块是从LRU的尾部开始的(最被使用端) 4、last recently use--最近最少使用原则,最近最少使用的块放在LRU的头部这个区域可以分出几个子组件:A 保持池--KEEP buffer pool缺省情况下这个池是不设置的,KEEP buffer cache=0 特殊情况下可以设置。作用:缓存的数据块是DBA不想让其从缓冲区中“挤”出去的数据块,因为这些数据块在业务上经常被查询的。另外开辟一个缓冲区以及对应的LRU链表,即KEEP POOL的区域和KEEP POOL的LRU链表,专门存放这些数据块SQL> alter system set db_keep_cache_size=5M scope=both;System altered.SQL> show parameter db_keepNAME TYPE VALUE------------------------------------ ----------- ------------------------------db_keep_cache_size big integer 16Mselect * from v$sga_dynamic_components --确认创建表的时候指定使用的缓冲池SQL> conn scott/scottConnected.SQL> create table x(x number) storage(buffer_pool keep);Table created.KEEP buffer cache设定了值,大小区域会GROW ,DEFAULT buffer cache 区域SHRINK,KEEP池是从缺省池中分了一部分空间出来B 回收池--RECYCLE buffer pool作用:缓存的数据块是DBA想让其从缓冲区中“挤”出去的数据块,因为这些数据块在业务上不经常被查询的。为了限定这些数据块的进入,限定的大小空间。SQL> show parameter db_recycleNAME TYPE VALUE------------------------------------ ----------- ------------------------------db_recycle_cache_size big integer 0SQL> alter system set db_recycle_cache_size=15M scope=both;System altered.SQL> show parameter db_recycleNAME TYPE VALUE------------------------------------ ----------- ------------------------------db_recycle_cache_size big integer 16M使用方法同上。回收池也是从缺省池中分配空间的。C 建表的时候不指定默认是缺省池。SQL> set long 10000SQL> select dbms_metadata.get_ddl('TABLE','EMP') from dual;DBMS_METADATA.GET_DDL('TABLE','EMP')-------------------------------------------------------------------------------- CREATE TABLE "SCOTT"."EMP" ( "EMPNO" NUMBER(4,0), "ENAME" VARCHAR2(10), "JOB" VARCHAR2(9), "MGR" NUMBER(4,0), "HIREDATE" DATE, "SAL" NUMBER(7,2), "COMM" NUMBER(7,2), "DEPTNO" NUMBER(2,0), CONSTRAINT "PK_EMP" PRIMARY KEY ("EMPNO") USING INDEX PCTFREE 10 INITRANS 2 MAXTRANS 255 COMPUTE STATISTICS STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645 PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT) --指定主键索引使用的缓冲区是缺省的缓冲区 TABLESPACE "USERS" ENABLE, CONSTRAINT "FK_DEPTNO" FOREIGN KEY ("DEPTNO") REFERENCES "SCOTT"."DEPT" ("DEPTNO") ENABLE ) PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255 NOCOMPRESS LOGGING STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645 PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT) --指定表使用的缓冲区是缺省的缓冲区- TABLESPACE "USERS"SQL> select dbms_metadata.get_ddl('TABLE','X') from dual;DBMS_METADATA.GET_DDL('TABLE','X')-------------------------------------------------------------------------------- CREATE TABLE "SCOTT"."X" ( "X" NUMBER ) PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255 NOCOMPRESS LOGGING STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645 PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL KEEP) --使用的是KEEP池缓存数据块的 TABLESPACE "USERS"注意:这两个区域的大小一旦设定不会变化,不受SGA自动管理的控制,这两个区域是手工管理的。C 非标准块大小的缓冲区标准块:oracle10g版本数据库块大小的默认值是8KSQL> conn /as sysdbaConnected.SQL> show parameter db_block_size --这个参数是创建库的时候指定的,建库完成后是不能改的。NAME TYPE VALUE------------------------------------ ----------- ------------------------------db_block_size integer 8192非标准块--不是8K都是非标准块。默认的缓冲区只能读入8K大小的数据块,其他大小事读不进去的。库A(10g) 8K库B(9i) 4K--数据文件导入到库A中当前库的数据块大小有8K和4K两种,两种块大小对应表做join连接时候,必须要求内存中有8K块大小的缓冲区和4K块大小的缓冲区SQL> show parameter cache_sizeNAME TYPE VALUE------------------------------------ ----------- ------------------------------db_16k_cache_size big integer 0db_2k_cache_size big integer 0db_32k_cache_size big integer 0db_4k_cache_size big integer 0db_8k_cache_size big integer 0db_cache_size big integer 0db_keep_cache_size big integer 16Mdb_recycle_cache_size big integer 16MSQL> alter system set db_4k_cache_size=17M scope=both;System altered.SQL> show parameter cache_sizeNAME TYPE VALUE------------------------------------ ----------- ------------------------------db_4k_cache_size big integer 32M db_cache_size = db_keep_cache_size + db_recycle_cache_size + db_nk_cache_size + DEFAULT buffer cache(只有这个部分是受SGA自动管理控制)########################################################################################### 5、数据库内存分配策略OLTP--事务型数据库,事务数量大,并发用户多,每个用户进程引发的数据量比较小,数据库相对繁忙。典型:电信BOSS、银行的网点、淘宝。OLAP--联机分析系统(数据仓库),事务量小,并发用户比较少,但是每个进程引发的数据量很大,数据库相对比较清闲,但是IO吞吐量很大。企业报表系统,数据分析系统,数据集市,数据挖掘系统。OLTP系统,需要的PGA(相当一部分是做运算的)相对少,所以分给Oracle内存的20%给PGA,80%给SGA例如服务器物理内存是16GB,这台设备除了Oracle以外不打算做别的服务器,拿出80%物理内存给ORACLE使用SGA=16GB*80%%80% PGA=16GB*80%%20%OLAP系统,需要大的PGA,所以分给Oracle内存的50%给PGA,50%给SGA例如服务器物理内存是16GB,这台设备除了Oracle以外不打算做别的服务器,拿出80%物理内存给ORACLE使用SGA=16GB*80%%50% PGA=16GB*80%%50%混合型:分给Oracle内存的40%给PGA,60%给SGA例如服务器物理内存是16GB,这台设备除了Oracle以外不打算做别的服务器,拿出80%物理内存给ORACLE使用SGA=16GB*80%%60% PGA=16GB*80%%40%上面提到的策略只是一般情况下的建议,有的时候特殊情况下,还是需要根据监控的结果做微调的。