1.1.1实例的概念 | |||||
实例是一组内存结构和后台进程的集合。 | |||||
oracle适用于大型的应用系统 | |||||
1.1.2实例的构成 | |||||
1.实例中的这部分内存结构叫做系统全局区(SGA):存储数据库中的数据、存储数据字典的信息、重做日志、经过解析的SQL代码等 | |||||
一个实例只有一个SGA: | SGA中的数据可以在多个用户进程之间共享; | ||||
SGA由若干个缓存和缓冲池构成,不同类型的数据存储在不同的缓存和缓冲池中。 | |||||
通过在参数文件中为各个缓存和缓冲池分别指定大小,可以确定SGA的大小 | |||||
2.程序全局区(PGA):当用户访问数据库时,实例为用户进程启动一个服务器进程,并分配一段内存区,用来保护用户进程的私有信息和控制信息 | |||||
SGA是所有用户进程共享的: | 只要实例被启动,无论是否有用户访问数据库,SGA都存在 | ||||
PGA是用户进程私有: | 用户进程发出请求,实例分配PGA,进程结束,PGA释放。 | ||||
3.内存结构包括SGA和PGA两部分 |
内存空间存储了: | ||||||||||||||||
程序代码 | ||||||||||||||||
缓冲数据 | ||||||||||||||||
与会话有关的信息 | ||||||||||||||||
与进程间通信有关的信息 | ||||||||||||||||
SGA中主要包含以下类型的内存结构: | ||||||||||||||||
数据库高速缓存 | ||||||||||||||||
重做日志缓冲区 | ||||||||||||||||
共享区 | ||||||||||||||||
java池 | ||||||||||||||||
大池 | ||||||||||||||||
查看SGA大小: | show sga | |||||||||||||||
1.2.1数据库高速缓存 | ||||||||||||||||
数据库高速缓存是SGA中的一段存储区域 | 逻辑读:直接在数据库高速缓存对数据进行访问,并将处理结果返回给用户,这次数据访问叫做:“命中” | |||||||||||||||
物理读:服务器进程将数据从数据文件的数据块中读到数据库高速缓存中,然后在数据库高速缓存对数据进行访问,这次数据访问叫做:“未命中” | ||||||||||||||||
直接在数据库高速缓存访问数据,要比从数据文件中读数据快得多 | ||||||||||||||||
访问数据的命中率越高,数据库的性能就越高 | ||||||||||||||||
数据库性能优化:提高逻辑读的比重 | ||||||||||||||||
数据库高速缓存的大小 | 通过初始化参数DB_CACHE_SIZE来指定 | |||||||||||||||
提高数据访问命中率最直接的方法是增加数据库高速缓存的大小(不能无限增加,受物理内存大小的限制) | ||||||||||||||||
数据块:(如果主要执行select语句可以设置大一些,修改语句就小一些) | 数据文件被划分为许多大小相同的数据块 | |||||||||||||||
是Oracle进行读写的基本单位 | ||||||||||||||||
提高了数据库服务器的吞吐量 | ||||||||||||||||
由初始化参数DB_BLOCK_SIZE指定 | ||||||||||||||||
例: | ||||||||||||||||
DB_CACHE_SIZE=25165824 | 缓冲区总的大小为25165824字节,及24mb | |||||||||||||||
DB_BLOCK_SIZE=8192 | 每个缓冲区大小为8192字节,就是8kb | |||||||||||||||
所以缓冲区的个数为25165824/8192=3072个 | ||||||||||||||||
缓冲区分为: | 空闲缓冲区 | 存放的是由SELECT命令检索的数据,而且这样的数据没有被修改过 | ||||||||||||||
存放的是由DML命令处理过的数据,而且这样的数据已经被写入数据块中 | ||||||||||||||||
用来存放用户即将访问的数据(空闲缓冲区的内容与对应数据库中的内容完全一致) | ||||||||||||||||
脏缓冲区 | 执行了INSERT\UPDATE\DELETE命令 | |||||||||||||||
数据修改之后还没有写入数据块,这时缓冲区中的内容与数据块不一致 | ||||||||||||||||
数据必须写入数据文件的数据块中,这个任务由后台进程DBWR完成 | ||||||||||||||||
写入后,脏缓冲区又成为空闲缓冲区 | ||||||||||||||||
忙缓冲区 | 指正在访问的缓冲区 | |||||||||||||||
两个用户进程不能同时访问同一个忙缓冲区 | 所以oracle采用LRU算法,确保数据访问的命中率 | |||||||||||||||
非标准数据块: | 2kb | 缓存由2kb的缓冲区组成 | DB_2K_CACHE_SIZE=48m | |||||||||||||
4kb | 缓存由4kb的缓冲区组成 | |||||||||||||||
8kb | 缓存由8kb的缓冲区组成 | |||||||||||||||
等等 | ||||||||||||||||
命令显示16kb缓冲区大小: | SHOW PARAMETER DB 16K CACHE SIZE NAME TYPE VALUE | |||||||||||||||
1.2.2重做日志缓存区 | ||||||||||||||||
重做日志是对用户事物所产生的记录。 | ||||||||||||||||
通过重新日志能够重新产生数据,它是确保数据安全的一种重要方法。 | ||||||||||||||||
当用户执行dml时,会将操作记录在重做日志缓冲区中,然后采取修改相应的数据 | ||||||||||||||||
重做日志缓冲区的大小由初始参数LOG_BUFFER指定 | ||||||||||||||||
1.2.3共享池 | ||||||||||||||||
为了提高数据库的性能,Oracle在SGA中开辟了一个共享池,用于存放与SQL语句的执行有关的信息。 | ||||||||||||||||
共享池的组成: | 数据字典高速缓存 | 存放最近访问的数据字典的信息,在查询相关的数据字典时,可以直接在数据字典缓存中执行 | ||||||||||||||
库高速缓存 | 存放最近执行的SQL命令的相关信息。(命令文本、解析结果、执行计划) | 已经存储过了就会直接提取出来 | ||||||||||||||
服务器结果缓存 | ||||||||||||||||
共享池的大小由初始参数SHARED_POOL_SIZE来指定 | ||||||||||||||||
1.2.4java池 | ||||||||||||||||
java池是sga中两段可选的存储区域。 | ||||||||||||||||
java池的大小由初始参数JAVA_POOL_SIZE来指定 | ||||||||||||||||
SELECT * FROM V$SGASTAT WHERE pool='java pool' | ||||||||||||||||
1.2.5PGA(程序全局区) | ||||||||||||||||
包含了服务器进程的数据和控制信息 | ||||||||||||||||
当服务器进程启动时,数据库服务器为它分配一段PGA,这个PGA只能由当前服务器进程访问。 | ||||||||||||||||
PGA包含: | (1)私有SQL区 | 在私有SQL区中保存了SQL语句的绑定信息和运行时的内存结构 | ||||||||||||||
当用户执行SQL语句时,将显式或隐式地使用游标,每个游标都有一段私有SQL区 | ||||||||||||||||
私有SQL区的位置与会话的连接方式有关 | ||||||||||||||||
(2)会话内存区 | 会话内存区保存会话变量和其他会话信息 | |||||||||||||||
“SQL”工作区:复杂的查询区域 | 大小可控制 | |||||||||||||||
WORKAREA_SIZE_POLICY(AUTO/MANUAL) | 将SQL工作区的管理方式设置为自动 | |||||||||||||||
PGA_AGGREGATE_TARGET | 指定sql工作区的大小 | |||||||||||||||
常用的后台进程及其功能: | ||
进程名称 | 功能 | |
DBWR | 将数据库高速缓存中的脏缓冲区内容写入数据库 | |
LGWR | 将重做日志缓冲区中的内容写入重做日志文件 | |
CKPT | 发出检查点。维护数据文件、控制文件和重做日志文件的一致状态 | |
SMON | 在数据库服务器重新启动时进行实例恢复 | |
PMON | 当用户进程执行失败时,释放服务器进程所占用的资源 | |
ARCH | 对重做日志进行归档 | |
查看在后台正在运行的进程: | SELECT name FROM v$bgprocess WHERE paddr<>'00' | |
1.3.1 DBWR(数据库写进程) | |||
功能: | 将数据库高速缓存中的脏缓冲区内容写入数据文件中的数据块。 | ||
默认值启动一个,但是可以启动多个 | |||
初始化参数 | DB_WRITER_PROCESSES | 最多可以启动20个 | |
不是越多越好 | |||
原则 | 不要超过CPU的数目 | ||
DBWR在以下几种情况执行写操作: | |||
1.固定的时间间隔 | |||
2.当数据库服务器发出检查点时 | |||
3.当脏队列的缓冲区数目达到一定值时(数据库高速缓存中不能有太多的脏缓冲区) | |||
4.空闲缓存区数量不能满足要求,就会进行写操作,部分脏缓冲区将重新成为空闲缓冲区 | |||
1.3.2LGWR(日志写进程) | |||
功能: | 将重做日志缓冲区中的重做日志写入重做日志文件 | ||
LGWR被启动执行的时机: | |||
1.固定的时间间隔 | |||
2.用户执行了COMMIT操作 | |||
3.重做日志缓冲区已经有1/3的空间被写满 | |||
4.DBWR将脏缓冲区写入数据文件之前 | |||