oracle SGA 内存结构以及进程
SGA --Database Buffer Cache
buffer cache 里面存放了从磁盘上读到内存中的数据块这些数据块可以被所有的会话访问,是全局共享的;
default pool -- block= 8k
- 正常情况下,数据块存放的内存区域。
keep pool
- 这个区域(池)用于将一些数据始终固定在内存中,default pool会根据一个过期算法(LRU)将过期的脏数据写到磁盘上.
recycle pool
- 存放一些不经常使用的数据块,避免这些数据库在default pool池中占据空间。
oracle 默认的数据块的大小是8K
SQL> show parameter k_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
alter system set db_16k_cache_size = 10M;
在database buffer cache 当中,一个buffer指的是用来从磁盘中读入的数据块在内存中的存放位置;可理解为 1buffer = 1 block;
buffer (内存数据块) 的3中状态
- unused :可用;
- clean :可覆盖;
- dirty :脏数据;
buffer 的2种模式
- current mode 当前模式;
- consistent mode 一致性模式; 数据一致性; time 时间一致;
redo log buffer 中存放着数据产生的redo数据;redo log buffer 以循环的方式写入;当redo log 已经写到磁盘后,就可以被后续的日志数据覆盖:
缓冲日志;
SGA -- shared pool
library cache
library cache里面保存着可执行的SQL及PL/SQL包,以及SQL的执行计划和一些控制结构,比如说锁。当一条SQL语句被执行时,oracle尝试到library cache中查找是否相同的SQL(通过hash_value),如果有,将直接重用存在的SQL的信息(执行计划);这个称作软解析(soft page)或者叫做library cache hit反之,SQL将被重新解析,这个过程称为hard parse 或者叫做library cache miss
data dictionary cache
- 数据字典区存放Oracle的数据字典信息,这些信息包含数据库中对象的数据信息,结构信息等,这些信息在SQL解析的过程中需要频繁的访问到。
- 视图 dba(all,user)_talbe...
- 基表user$,table$...
- 固化表 X$ ... x$bh block head
SGA -- server result cache
这部分内存中保留了SQL查询的结果集,这样对于后续的相同查询,Oracle无需重新加载数据块进行计算,直接使用现有的数据集。
- 由参数result_cache_mode设定
. 默认值manual,需要使用result_cahce hint来启用。
. force对所有select操作生效(会消耗更多shared_pool空间)
PL/SQL 函数结果
- 对于PL/SQL函数,对结果进行缓存
SGA -- large pool
- 并行执行时
streams pool
streams pool里面存放着流相关的信息,比如流队列信息,同时也为流复制中capture进程提供进程内存空间。
streams pool只为流复制提供内存空间,如果没有手工配置,也没有配置流复制,这个空间将为0
JAVA pool
- 用于保存会话运行的java代码和信息,
比如java类,方法....
fixed SGA
- 保存通用的数据库和实例状态信息。
- 保存实例间通讯需要的结构,比如锁。
- 大小通常改变很小,无法手工改变。
SQL> show sga;
Total System Global Area 1219260416 bytes
Fixed Size 2212856 bytes
Variable Size 872418312 bytes
Database Buffers 335544320 bytes
Redo Buffers 9084928 bytes
PGA --program Global Area
独立内存区域; 进程独立;
1、Sort Area
2、Hash Area
3、bitmap merge area
4、session memory
5、persistent area
6、runtime area
PGA 是一个进程占用的内存区域,可以理解为操作系统在一个进程启动时,为它分配的内存空间,是一个操作系统含义上的内存区。
private SQL Area
UGA-User Global area
UGA 是一个会话含义的内存区,它保存着和会话相关的信息,比如会话登录信息,绑定变量的值,PL/SQL包的参数信息等。
- UGA必须保证会话能够访问到UGA当中的数据,因此UGA的位置会随着数据库连接方式的不同而不同。
- 当连接使用的是专用模式(dedicated)时,因为会话是专用的,所以UGA属于PGA的一部分。
- 当连接模式为MTS时,由于会话可能会使用任意一个共享进程,因此这些进程必须能够同时访问UGA的数据,此时Oracle会把UGA放在SGA区中(共享内存区域)。
session variable 登录信息,变量值,PL/SQL参数...
OLAP pool olap 维度对象,比如cube;
总结:
SGA的目的在于数据共享,它的特点是:
- 数据并发访问
- 锁定和队列机制(latcha,lock..)
- 是一个常见的性能瓶颈区。 OLTP
- 是一个数据库优化经常关注的区域
: data buffer hit
: library hit(herd parse,soft parse)
: hot block
PGA是为专有进程服务的,进程间无法进行数据共享,它的特点是:
- 数据独占性
- 无需锁定机制
- 性能优化上只需考虑它的大小.
database writer
数据内存同步磁盘
log writer
日志内存同步磁盘
Oracle Process
-- Oracle实例的后台进程--SMON (非常重要;RAC 存储共享; redo对实例共享;)
SMON的主要工作;数据块的管理;
- 数据库启动时的实例恢复,在RAC环境下,一个节点的SMON可以对另外一个节点做实例恢复。
- 清理和释放临时段上的数据(排序,临时表..)
- 对于DMT(字典管理表空间),SMON可以合并连续空闲的extent
- 维护回滚段的online,offline 以及空间回收.
临时段(临时数据:排序数据,临时表)
undo表空间;独立的表空间;
-- Pmon后台进程负责 自动注册监听器;
- 进程异常终止
- 会话被杀掉
- 事物超过空闲时间
- 网络链接超时
- 将实例信息注册到监听器上
. 手工注册 alter system redister;
Pmon进程的清理工作;
- 回滚未提交的事物,释放事务相关的资源
. 重置undo数据块上的事务
. 释放事务产生的锁。
. 从v$session中清除异常终止的会话ID。
-- Oracle实例的后台进程 --DBWn
- 负责将buffer cache中脏数据(修改过的数据)块写到磁盘上,由于数据块在磁盘上的位置不连续,这个过程比LGWR比;较耗时。
DBWn触发条件
- 当server process无法在buffer cache中找到可用的buffer时。
- DBWn接到check point的指令,将脏数据写到磁盘上。
可以通过设置多个DBWn进程加快脏数据写入磁盘的数度
- DB writer processes
内存中的数据块,跟磁盘中的数据块(位置)是一一对应的;然而会导致数据库地随机写入;
--Oracle 实例的后台进程 --ckpt
check point 的目的: 数据库在某个时间的快照;
- 减少数据库实例恢复的时间
- 让内存中的脏数据及时的写到磁盘上。
- 在安全关闭数据库时,保证所有提交的数据被写到磁盘上。
check point的触发
- database checkpoint
. consistent datables shutdown 一致性的数据库关闭
. alter system checkpoint statement 人工做一次检查点;
. oniline redo log switch 日志切换;会触发检查点;
. alter database begin backup statement
tablespace and data file checkpoint
. tablespace read only 表空间只读
. tablespace offine normal 表空间下线;
. shrinking a data file 收缩数据文件;
. alter tablespace begin backup 对表空间备份;
Incremental checkpoints
oracle 实例的后台进程 --ckpt
ckpt进程通知DBWn 进程开始将内存(buffer cache)中的脏数据写到磁盘文件上。CKPT负责更新文件头和控制文件的信息:
Oracle 实例的后台进程--LGWR
LGWR负责将log buffer中的数据顺序的写到磁盘上online redo file,由于是顺序的写入,效率要比DBWn高很多。
LGWR触发条件
- 用户提交事务(commit)
- 日志切换
- 最后一次提交经过了3秒。
- redo log buffer容量达到了1/3或者达到了1M的redo数据。
- DBWn进程把脏数据写入磁盘前,必须保证这些脏数据对应的日志信息已经被写进磁盘,如果发现脏数据的日志信息没有写入磁盘,DBWn通知LGWR进程写日志信息,完成后继续将脏数据写入磁盘.
在编写SQL时为什么要使用变量;当使用绑定变量时,即使你改变了绑定变量的值。Oracle还是可以共享这个语句;
锁存器是oracle为了读取存放在库高速缓存或者其他内存结构中的信息时必须获得的一种锁。锁存器可以保护库高速缓存避免两个同时进行的会话修改,或者一个会话正要读取的信息被另一个会话修改而导致的损坏;在读取库高速缓存中任何信息之前,oracle都会获得一个锁存器,其他所有会话都必须等待,直到该锁存器被释放它们才能获得锁存器以完成工作;
SGA-缓冲区缓存
缓冲区缓存是系统全局内存区域(SGA)最大部分之一。在数据库块从硬盘中读取出来后或写入硬盘之前,它用来存储数据块。块是Oracle进行操作的最小单位。块中含有表、数据、行或索引条目,一些块还会包含用来排序的临时数据。需要记住的关键一点是,oracle必须读取块来获得SQL语句需要的数据行。块的典型大小有4KB、8KB或16KB,块大小的唯一限制因素取决于你所使用的操作系统。 Oracle数据库实列由系统全局内存区域(system global area ,SGA)以及一系列的后台进程组成。每一个连接到数据库的用户都是通过一个客户端进程来进行管理的.客户端进程是与服务器进程相连接的,每一个服务器进程都会分配一块私有的内存区域,称为程序共享内存区域(program global area) 或进程共享内存区域(process global area , PGA)
SGA-共享池
共享池是内存中最关键的部分之一;特别是对于SQL的执行来说.你写SQL语句的方法并不仅仅会影响到这一句SQL语句本省.数据库中正在执行的所有SQL语句结合在一起将会因为它们对共享池的影响而对总的性能和扩展性带来巨大的影响.
共享池是Oracle缓存程序数据的地方。执行过的每一句sql语句在共享池中都存有解析后的内容。共享池中存储这些语句的地方称为库高速缓存(library cache)。即使在解析每一句语句前,oracle都会检查库高速缓存看其中是否已经存在同样的语句,oracle通常都会只解析该语句一次,然后在所有想要使用的用户之间共享。也许从中你可以看出共享池是如何得名的。当然;Oracle所使用的系统参数也将放在其中.有一块被称为数据字典高速缓存(dictionary cache)的区域,Oracle还会存储所有的数据库对象信息。一般来说,oracle将你能想到的几乎所有东西都存在共享池中;
库高速缓存
YES,oracle将取回之前解析的信息并重用。这种类型的解析被称为软(soft)解析。NO,oracle将执行所有的工作来为当前的语句生成执行计划,并且将它存在缓存中以便将来重用。这种类型的解析被称为硬(hard)解析
为了确定一条语句是不是之前执行过,oracle会去检查高速缓存是不是存在同样的语句。你可以通过查询V$sql视图来查看当前存放在高速缓存中的语句.这个视图列出了共享SQL区域的统计信息,并且包含了最初输入的SQL文本每个子成员的一行.
每一个块都有一定的结构。块中的一些区域含有Oracle用来进行管理的块本身的信息.有表示块的类型的信息(表、索引等)、稍许关于改块的事务处理信息、在磁盘中该块所处的地址信息、存储数据在改块中的表的信息,以及块中所包含的行数据信息。块中剩下的部分用于存放实际的数据或是新数据可以存进来的空白空间.
2.7 视图合并
正如其名字所暗示的,视图合并是一种能将内嵌或存储式视图展开为能够独立分析或者与查询剩余部分合并成总体执行计划和独立查询块的转换。改写后的语句基本上不包含视图。一个如select * from my_view的语句将会被改写为好像直接输入了视图源一样,视图合并常常发生在外部查询快的谓语包括下列项的时候。
######能够在另一个查询块的索引中使用的列。########
######能够在另一个查询块的分区截断中所使用的列。#######
######在一个联结视图中能够限制返回行数的条件。#######