1.Oracle的体系结构
2.实例之内存
oracle内存主要分为两部分:SGA+PGA
1.SGA:全称system global area
- SGA中包括oracle实例所需要的一系列内存组件,用于存放数据信息和数据控制信息,比如buffer cache/share pool/log buffer...
- 这些内存信息被所有进程所共享(server process,backgroud process)
- 在一个实例中只要一个sga,且为所有session共享,随着instance启动而分配
- instance down时,sag被释放
2.SGA的基本组件如下:
2.1 share pool
share pool主要有库缓存(Libary cache),和数据字段缓存(data dictionary cache),以及结果缓存(result cache)等组成。
Library cache:sql和plsql的解析场所,存放sql、plsql的代码,以及它们的执行计划,以备其他用户共享,当一条SQL语句被执行时, Oracle尝试到Library Cache中查找是否有相同的SQL(通过hash_value),如果有 ,将直接重用存在的SQL的信息(执行计划),这个称作软解析(soft pase)或者叫做library cache hit,反之,SQL将被重新解析,这个过程称为hard parse或者叫library cache miss.
data dictionary cache:存放重要的数据字典信息,以备其他用户共享,且这些信息包含数据库中对象的数据信息,结构信息等,这些信息在SQL解析的过程中需要被频繁使用到。比如说视图dba(all,user)_tables... 基表user$,table$ 固化表 X$,x$bh
server Result cache:这部分保留了sql查询的结果集以及plsql函数返回值,这样对后续的相同的查询,oracle无须加载数据块进行计算,直接使用现有的结果集。
2.2 database buffer cache
-database buffer cache用于存储从磁盘数据文件中读入的数据,为所有用户共享。
-服务器进程(server process)负责将数据文件数据从磁盘读入数据内存缓冲区,当后续请求需要这些数据时,如果在内存中,则不再需要重新去去磁盘上进程读取。
-数据缓冲区中被修改的数据块(脏块)由后台进程DBWN将其写入磁盘。
-数据缓冲区的大小对数据库的读取速度有直接的影响。
要弄明白database buffer cache中的几个重要的概念
database buffer cache=(default pool) +(nodefault pool)
其中:default pool(参数db_cache_size)是标准块存放的内存空间大小,SGA自动管理时此参数不用设置。使用LRU算法清理空间,
no default pool包含keep pool和recycle pool,其中keep pool 用于将一些数据固定在内存中,default pool会根据一个过期的算法(LRU)将过期的脏数据刷到磁盘上。recycle pool主要存放不常用的数据块,避免这些数据块在default pool池中占据空间。其中,no default pool对应的参数有:
db_nk_cache_size; 指定非标准块大小内存空间,比如2k、4k、16k、32k。
db_keep_cache_size: 存放经常访问的小表或索引等。
db_recycle_cache_size: 与keep相反,偶尔存放做全表扫描的大表数据。