知识积累
-
buffer :数据库缓冲区中内存块的大小,和数据库数据文件的块的大小完全一致;是database buffer cache里分配的最小单位
-
数据库缓冲区存在的目的:
- 做的所有的操作都是在内存里;
- 优化物理 I/O(内存的读写效率要远远高于磁盘的IO)
- 能够缓存经常被访问的数据块,提高数据处理的效率。
-
Buffer States:
- unused: 未被使用的 ##一次也未被使用的
- clean: 干净的 ##说明buffer里面的数据信息和数据文件对应的数据块的存储内容是一致的
- dirty: 脏块 ##说明buffer里面的数据信息和数据文件对应的数据块的存储内容不一致
-
每个buffer的访问模式:
- pinned:就是这个buffer正在被读或者写;
- free:空闲状态
-
Buffer Modes:
- Current mode:当前模式。
A current mode get, also called a db block get, is a retrieval of a block as it currently appears in the buffer cache - Consistent mode:一致性模式。(read)
A consistent read get is a retrieval of a read-consistent version of a block. This retrieval may use undo data.
- Current mode:当前模式。
一、SGA
System Global Area(系统全局区)
- 是共享的,是所有使用当前实例的用户都可以读取的内存部分
- 由内存组成,其中存储数据、用户信息和控制信息等
- 一个SGA只能服务一个实例,多实例间不能互相访问SGA
- 实例关闭的时候,系统回收内存,SGA即消失
1.1 fixed sga - 固定SGA
固定SGA 是内部的内务管理区域。例如,固定SGA 包含:1)有关数据库及其实例状态的一般信息,后台进程需要访问这些信息2)进程间通讯的信息,如有关锁的信息。
固定 SGA 的大小由 Oracle server设置,且不能手动更改。固定SGA 大小可能会因为版本不同而不同。
1.2 Redo buffer - 重做缓冲区
如果数据需要写到在线重做日志中,则在写磁盘前要在redo buffer中临时缓存这些数据。
redo log buffer
- 是SGA当中的一个循环使用的buffer,存放描述数据块变化的redo entries。(redo entries包含用于重建、重做和dml或者ddl语句所造成的数据库的变化的信息)
- 实现先记录日志, 然后再修改数据,保证数据的一致性;
- 重做记录并不直接写入磁盘的重做日志文件,而是先写入重做日志缓存,当重做日志缓存中的重做记录达到一定数量时,由(日志写入进程)LGWR进程写入重做日志。(先内存后磁盘)
1.3 Block buffer cache - 块缓冲区缓存
-
默认池(default pool):所有段块一般都在这个池中缓存。如果没有做任何特殊配置,那么数据块默认被cache到default buffer pool;
-
保持池(keep pool):将一些频繁被访问的表,固定在数据库缓冲当中,不会因为缓冲区不足,而被置换出内存;
-
回收池(recycle pool):缓存某些不被经常访问的表,被cache,access之后,马上置换出内存;
-
nK:非标准块的缓冲区大小,主要用于从一个数据库向另一个数据库传输数据(传输表空间)
分类目的:保证数据文件的数据块的大小要和buffer的大小保持一致;
Least Recently Used (LRU) List :按照buffer被访问的频率排列,如果需要free buffer就从LRU中找
1.4 Shared pool - 共享池
共享池:缓存不同类型的程序数据

-
Library Cache:
-
The library cache is a shared pool memory structure that stores executable SQL and PL/SQL code.
-
库缓存,缓存了可执行的sql和pl/sql代码
-
软解析:数据库趋向于使用已经解析过,存放在库缓存中的sql代码。重用库缓存中的sql code的过程,称为soft parse(软解析);
-
硬解析:反之,如果不能重用library cache中的sql code,那么,称之为hard parse(硬解析);
解析:通过sql语句的执行过程,来描述解析的概念:
1.查看sql的语法,语义部分;例如:select employee_id,salary from hr.employees;
2.将这个sql做hash运算,变成一段hash代码;
3.用这个hash值,去shared pool里面的library cache找, 查找是否有相同的hash值
–如果存在,说明这条语句被执行过,直接重用这个执行代码就好了;
–如果不存在,需要解析这条语句:oracle server需要根据这条语句的具体相关信息,找出一个最优化的执行计划;
-
-
Data Dictionary Cache:数据字典缓存,数据字典的元数据信息
-
Server Result Cache:服务器结果缓存–11g新特性,可以手动设置缓存哪些sql
-
Reserved Pool:保留池,常驻shared pool 里
-
解决内存碎片而无法分配足够的内存空间的问题:
-
当shared pool中的chunk被用的都只剩一小部分,而无法在放大的解析结果数据的时候,此时启用Reserved Pool中的chunk;
chunks:shared pool由许多内存块组成,这些内存块通常称为chunk。
chunk是shared pool中内存分配的最小单位,一个chunk中的所有内存都是连续的。
-
查看sql相关信息:
select sql_text,sql_id,parse_calls, executions from v$sql where sql_text like '%insert into t values%';
共享sql设置方法: --减少硬解析
1、统一书写格式
2、使用绑定变量
查看解析信息的数据字典:
SYS@prod>select name,value from v$sysstat where name like 'parse%';
NAME VALUE
------------------------------ ----------
parse time cpu 7368
parse time elapsed 15961
parse count (total) 84452
parse count (hard) 9464
parse count (failures) 354
parse count (describe) 138
6 rows selected.
1.5 Large pool - 大池
大池:主要是用来处理并行的时候使用。是一个可选的内存区域,它所提供的内存分配往往比共享池分配的内存更大。
应用场景:
- 共享服务器的UGA,和 Oracle XA接口 (用于与多个数据库进行交互事务的外部接口)
- 并行执行语句中使用的消息缓冲区
- 恢复管理器 (RMAN) I/O 从属进程的缓冲区
通过从大池中为共享SQL分配会话内存,数据库可以避免由收缩共享 SQL 缓存引起的性能开销。通过为 RMAN 操作、I/O 服务器进程、和并行缓冲区等分配大的缓冲区内存,大池可以比共享池更好地满足大型内存请求

并行:一个任务多个进程同时执行
并发:同时访问某一服务
1.6 java pool - Java池
Java池:用来解析java代码的
Java 池是一个存储Java 虚拟机 (JVM) 内所有会话特定的 Java 代码和数据的内存区。此内存包括在调用端迁移到 Java 会话空间的Java 对象
1.7 stream pool - 流池
流池:在使用stream流复制的时候使用。用于缓存流进程在数据库间移动或复制数据时使用的的队列消息,并为Oracle流的捕获进程和应用进程提供内存。
- 流池专门由Oracle 流使用。
- 如果您没有专门配置流池,则其大小从零开始。
- 流池的大小由Oracle 流按需动态增长。
1.8 Sort Extent Pool
Sort Extent Pool:在内存中保存临时段
在这个表空间中创建的临时段不会在排序的结束的时候取消分配。 而是记为空闲,
不放回空闲列表,并保留再利用。
1.9 Flashback Buffer
Oracle 10g开始,如果数据库启用flashback功能,Oracle即在SGA中分配flashback buffer(闪回缓冲区)
闪回缓冲区中(Flashback Buffer)按照一定的时间间隔存储的变化数据
二、PGA和UGA
2.1 定义
Process Global Area - 进程全局区(也称私有全局区):操作系统进程或线程专用的内存,不允许系统中的其他进程或线程访问
PGA 是一个非共享的内存区域,其中包含专门供server process进程使用的数据和控制信息。
User Global Area - 用户全局区: 是与某个用户会话相关联的内存区,UGA 是为会话变量分配的会话内存,如登录信息和数据库会话所需的其他信息。
UGA 必须在数据库会话的整个存活期间是可用的
2.2 根据oracle服务器的连接模式分类
2.2.1 dedicated server - 专用服务器
如果是dedicated server,那么oracle会为每一个用户的请求,分配一个server process(服务器进程),分配进程的同时为这个进程分配内存空间,即PGA。这时PGA和UGA存放在一起。
1)PGA包含的内容:

- SQL Work Areas:
- Sort Area:order by会在这个区域进行
- Hash Area:多表连接的时候,hash连接做hash运算
- Bitmap Merge Area:位图合并区域
- Private SQL Area:私有SQL 区保存了有关某个已解析的 SQL 语句的信息,和其它特定会话的信息;
- Persistent Area:绑定变量的信息
- Runtime Area :查询执行状态信息
- Session Memory: UGA
2)PGA的作用:
- 保存用户的连接信息和绑定变量的信息,查询执行状态信息
- 保存用户权限等重要信息,当用户进程和数据库建立会话的时候,系统(server process)会将这个这个用户的相关权限查询出来,然后保存在这个会话区域内;
- 当需要排序的时候,或是要建立大的索引的时候,会在PGA里的sort area里进行排序, 如果内存空间放不下排序的数据大小,超出部分就会在临时表空间内完成。
2.2.2 shared server - 共享服务器
如果是shared server,默认放置到shared pool,如果配置了large pool,那么UGA会在SGA中的large pool当中。此时任何共享服务器进程都能访问,而server process进程是有一定数量的, 轮流处理每个用户的相应请求,而不是某个用户专用的




