oracle系统结构
完整的数据库 包括两部分 oracle 数据库实例和数据库
1 数据库是一系列物理文件的集合(数据文件,控制文件,联机日志,参数文件等)
2 oracle 数据库实例则是一组oracle后台进程/线程以及在服务器分配的共享内存区
oracle 有个很大的内存块,成为全局区
系统全局区--System global area(SGA) 是一组共享的内存结构,它里面存储了oracle数据库实例(instance)的数据和控制文件信息。如果有多个用户同时连接到数据库,他们会共享这一区域,因此SGA也称之为Shared Global Area。当数据库实例启动时,SGA的内存被自动分配;当数据库实例关闭时,SGA内存被回收。
SGA是占用内存最大的一个区域,同时也是影响数据库性能的重要因素。
SGA主要包括以下几部分:
- 共享池
- 数据缓冲区
- 大型池
- Java池
- 日志缓冲区
上面几部分内存加起来,就是SGA内存的总和。其中比较重要的是共享池和数据缓冲区,后面将会重点讲解它们
共享池
是对SQL,PL/SQL程序进行语法分析,编译,执行的内存区域。
它包含三个部分:
a 库缓冲区(Library Cache)包含SQL,PL/SQL语句的分析码,执行计划;
b 数据字典缓冲区(Data Dictionary Cache)表,列定义,权限;
c 用户全局区(Usr Global Area)用户MTS会话信息。
ORACLE执行SQL语句时,先将SQL语句的字串通过一个hash算法得出一个hash值,然后检查共享池中是否已存在这个哈希值,若有就用已缓存的执行计划来执行这个语句(即缓存命中,后面我们会提到共享池的命中率,就是这个概念),若没有(即缓存缺失)则需进行解析。
由于Oracle是通过SQL字符的hash值来判断是否为相同的SQL语句,因此,如果你的SQL有一点小小的变换,在Oracle看来,就是另外一个SQL了,会对它进行重新解析。
共享池命中率可以反映出SQL重复使用率的高低,命中率越高,说明SQL重复使用率越高,也就是节省的SQL解析时间越多,反映在系统上就是查询数据越快。
可以通过以下命令查看命中率:
select sum(pinhits) / sum(pins) * 100 "看命中率咯" from v$librarycache;
如果命中率低于95%,则要考虑调整共享池大小。我们知道,如果没有在程序里使用绑定变量,那么就算共享池再大,也不会有什么好的效果,反而会有副作用。因此,更重要的事情是把使用最多的SQL改成绑定变量,你将会看到明显的效果。
数据缓冲区
如果每次执行一个操作时,Oracle都必须从磁盘读取所有数据块并在改变它之后又必须把每一块写入磁盘,显然效率会非常低。数据缓冲区存放需要经常访问的数据,供所有用户使用。修改数据时,首先从数据文件中取出数据,存储在数据缓冲区中,修改/插入数据也存储在缓冲区中,commit或DBWR(下面有详细介绍)进程的其他条件引发时,数据被写入数据文件。数据缓冲区的大小是可以动态调整的,但是不能超过sga_max_size的限制。
可以通过下面的命令查看命中率:
select (1 - ((physical.value - direct.value - lobs.value) / logical.value)) * 100 "命中率"
from v$sysstat physical,
v$sysstat direct,
v$sysstat lobs,
v$sysstat logical
where physical.name = 'physical reads'
and direct.name = 'physical reads direct'
and lobs.name = 'physical reads direct (lob)'
and logical.name = 'session logical reads';
SGA 包含数个重要区域,分别是:
■ Database Buffer Cache (数据库缓冲区)
■ Redo Log Buffer (重做日志缓冲区)
■ Shared Pool (共享区)
■ 其它,如Java pool, Large pool
数据块block 是oracle
存储数据信息的最小单位,oracle也就是通过数据块来屏蔽不同操作系统的差异,相当于一个层次的抽象,我们从数据库中查询一行,实际上就是操作一个数据库,然后再返回数据块中的指定数据行
数据块的默认大小是8kb, show parameter
db_block_size,数据块过大,耗费sga内存,过小会导致频繁的IO逻辑物理读。
区 extent 是比数据块大一级的存储结构,表示一连串连续的数据块集合 ,视图dba_extend 是研究区的重要手段
数据段segment
与数据库对象相对应,一般一个数据对象对应一个数据段,从dba_segment视图中,可以比较看清楚数据段的结构
数据段是在数据对象创建的时候分配的,随着对象体积的增加,而不断分配多个extents进行管理,一个对象创建,在segment层次上是分配一个区和八个数据块
分区表的时候,一个分区要对应一个segment对象。
一个表空间可以指定多个数据文件,所以要想数据对象访问IO负载均衡,需要指定不同的表空间,这就是为什么数据表和索引在不同的表空间的原因
一个用户对应一个schema,schema 是逻辑对象的集合组织,同表空间的等概念不是一个层面的