oracle体系结构-内存管理


一、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 sga

Total System Global Area      608174080 bytes
Fixed Size                           1268920 bytes
Variable Size                       230687560 bytes
Database Buffers                   373293056 bytes
Redo Buffers                           2924544 bytes

后台进程
[oracle@oracle3 ~]$ ps -ef|grep ora_            红色标志为5个必要进程,其它为非必要进程
oracle    2548     1  0 08:54 ?        00:00:00 ora_pmon_ORCL
oracle    2550     1  0 08:54 ?        00:00:00 ora_psp0_ORCL
oracle    2552     1  0 08:54 ?        00:00:00 ora_mman_ORCL
oracle    2554     1  0 08:54 ?        00:00:00 ora_dbw0_ORCL
oracle    2556     1  0 08:54 ?        00:00:00 ora_lgwr_ORCL
oracle    2558     1  0 08:54 ?        00:00:00 ora_ckpt_ORCL
oracle    2560     1  0 08:54 ?        00:00:00 ora_smon_ORCL
oracle    2562     1  0 08:54 ?        00:00:00 ora_reco_ORCL
oracle    2564     1  0 08:54 ?        00:00:00 ora_cjq0_ORCL
oracle    2566     1  0 08:54 ?        00:00:00 ora_mmon_ORCL
oracle    2568     1  0 08:54 ?        00:00:00 ora_mmnl_ORCL
oracle    2570     1  0 08:54 ?        00:00:00 ora_d000_ORCL
oracle    2572     1  0 08:54 ?        00:00:00 ora_s000_ORCL
oracle    2576     1  0 08:54 ?        00:00:00 ora_qmnc_ORCL
oracle    2768     1  0 08:54 ?        00:00:00 ora_j000_ORCL
oracle    2791     1  0 08:54 ?        00:00:00 ora_q000_ORCL
oracle    2793     1  0 08:54 ?        00:00:00 ora_q001_ORCL


ORCL和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 sysdba
Connected.
SQL> show sga

Total System Global Area  608174080 bytes   --580M,内存中分出580M让SGA使用   
-----------------------------------------------------------
Fixed Size            1268920 bytes
Variable Size          230687560 bytes
Database Buffers      373293056 bytes
Redo Buffers            2924544 bytes
------------------------------------------------------------

SQL> select 608174080/1024/1024 from dual;

608174080/1024/1024
-------------------
        580


SQL> show parameter sga_max_size

NAME                     TYPE     VALUE
------------------------------------ ----------- ------------------------------
sga_max_size                 big integer 580M    --SGA控制参数

一个节点一般只会放一个数据库的。如果这个节点仅仅就是数据库服务器,其他服务没有,可以将SGA增大到物理内存的50%~60%。

SQL> show parameter sga_target

NAME                     TYPE     VALUE
------------------------------------ ----------- ------------------------------
sga_target                 big integer 580M   --SGA目标参数,实际上还兼有SGA自动管理开关的功能。
                                          不为0,则表示自动管理,为0手动管理。


实操案例:调整SGA大小

oracle建议:sga_max_size = sga_target    SGA参数是静态参数,需要重启才能生效。

sga_max_size >= sga_target

SQL> alter system set sga_max_size=1024M scope=spfile;

System altered.

SQL> show parameter sga_max_size

NAME                     TYPE     VALUE
------------------------------------ ----------- ------------------------------
sga_max_size                 big integer 580M

SQL> shutdown immediate
Database closed.
Database dismounted.
ORACLE instance shut down.
SQL> startup
ORACLE instance started.

Total System Global Area 1073741824 bytes
Fixed Size            1271616 bytes
Variable Size          696256704 bytes
Database Buffers      373293056 bytes
Redo Buffers            2920448 bytes
Database mounted.
Database opened.

SQL> show parameter sga_max_size

NAME                     TYPE     VALUE
------------------------------------ ----------- ------------------------------
sga_max_size                 big integer 1G

SQL> alter system set sga_target=1G scope=both;  --再去修改SGA目标参数

System altered.

SQL> show parameter sga_target

NAME                     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 buffer
Java池        大池            共享池        流池            高速缓冲区           重做日志缓冲区

参数:

SQL> show parameter java_pool

NAME                     TYPE     VALUE
------------------------------------ ----------- ------------------------------
java_pool_size                 big integer 0


共享池---库高速缓存区+数据字典高速缓存区
SQL> show parameter large_pool

NAME                     TYPE     VALUE
------------------------------------ ----------- ------------------------------
large_pool_size              big integer 0

SQL> show parameter shared

NAME                     TYPE     VALUE
------------------------------------ ----------- ------------------------------
shared_pool_size             big integer 0

SQL> show parameter stream

NAME                     TYPE     VALUE
------------------------------------ ----------- ------------------------------
streams_pool_size             big integer 0

SQL> show parameter db_cache_size

NAME                     TYPE     VALUE
------------------------------------ ----------- ------------------------------
db_cache_size                 big integer 0

SQL> show parameter log_buffer

NAME                     TYPE     VALUE
------------------------------------ ----------- ------------------------------
log_buffer                 integer     2875392

pfile文件:
ORCL.__db_cache_size=838860800
ORCL.__java_pool_size=33554432
ORCL.__large_pool_size=4194304
ORCL.__shared_pool_size=192937984
ORCL.__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 sga

Total System Global Area 1073741824 bytes    --SGA总大小1GB
------------------------------------------------
Fixed Size            1271616 bytes    --固定区域大小,空池,自启区
Variable Size          230688960 bytes    --可变区域大小
Database Buffers      838860800 bytes    --数据库高速缓冲区db_cache_size
Redo Buffers            2920448 bytes    --日志缓冲区大小
----------------------------------------

Variable Size = shared_pool_size + java_pool_size + streams_pool_size + large_pool_size + free memory

overhead(SGA的头部)包含在shared_pool_size中

SQL> col name format a30        --完整显示结果
SQL> select * from v$sgainfo;            --sga的详细信息

NAME                    BYTES RESIZEABLE
------------------------------ ---------- ---
Fixed SGA Size              1271616 No
Redo Buffers              2920448 No
Buffer Cache Size        838860800 Yes   == Database Buffers
Shared Pool Size        192937984 Yes
Large Pool Size           4194304 Yes
Java Pool Size             33554432 Yes
Streams Pool Size            0 Yes    --RESIZEABLE是YES的 SGA自动管理范畴
Granule Size              4194304 No     --颗粒数大小
Maximum SGA Size           1073741824 No     --SGA最大值
Startup overhead in Shared Pool     46137344 No     --overhead
Free 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    -- TEMP

SQL> 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 pga

NAME                     TYPE     VALUE
------------------------------------ ----------- ------------------------------
pga_aggregate_target             big integer 192M

调整参数:

SQL> alter system set pga_aggregate_target=300M scope=both;  

System altered.

SQL> show parameter pga

NAME                     TYPE     VALUE
------------------------------------ ----------- ------------------------------
pga_aggregate_target             big integer 300M        --建议初始化下先给200~300M,需要时慢慢加

PGA+SGA=1324M  物理内存是2G,目前是没有超出范围的。

PGA的自动管理方式:

SQL> show parameter work

NAME                     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的时候,颗粒大小事16M

SQL> alter system set sga_max_size=1200M scope=spfile;

System altered.

SQL> startup force
ORACLE instance started.

Total System Global Area 1258291200 bytes
Fixed Size            1267260 bytes
Variable Size          469764548 bytes
Database Buffers      771751936 bytes
Redo Buffers           15507456 bytes
Database 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 No
Redo Buffers             15507456 No
Buffer Cache Size        956301312 Yes
Shared Pool Size        251658240 Yes
Large Pool Size          16777216 Yes
Java Pool Size             16777216 Yes
Streams Pool Size            0 Yes
Granule Size             16777216 No     --颗粒数
Maximum SGA Size           1258291200 No
Startup overhead in Shared Pool     50331648 No
Free SGA Memory Available        0

11 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_keep

NAME                     TYPE     VALUE
------------------------------------ ----------- ------------------------------
db_keep_cache_size             big integer 16M


select * from v$sga_dynamic_components   --确认

创建表的时候指定使用的缓冲池

SQL> conn scott/scott
Connected.
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_recycle

NAME                     TYPE     VALUE
------------------------------------ ----------- ------------------------------
db_recycle_cache_size             big integer 0
SQL> alter system set db_recycle_cache_size=15M scope=both;

System altered.

SQL> show parameter db_recycle

NAME                     TYPE     VALUE
------------------------------------ ----------- ------------------------------
db_recycle_cache_size             big integer 16M

使用方法同上。回收池也是从缺省池中分配空间的。

C 建表的时候不指定默认是缺省池。

SQL> set long 10000
SQL> 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版本数据库块大小的默认值是8K

SQL> conn /as sysdba
Connected.
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_size

NAME                     TYPE     VALUE
------------------------------------ ----------- ------------------------------
db_16k_cache_size             big integer 0
db_2k_cache_size             big integer 0
db_32k_cache_size             big integer 0
db_4k_cache_size             big integer 0
db_8k_cache_size             big integer 0
db_cache_size                 big integer 0
db_keep_cache_size             big integer 16M
db_recycle_cache_size         big integer 16M

SQL> alter system set db_4k_cache_size=17M scope=both;

System altered.

SQL> show parameter cache_size

NAME                     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%


上面提到的策略只是一般情况下的建议,有的时候特殊情况下,还是需要根据监控的结果做微调的。



你可能感兴趣的:(oracle,服务器)