Oracle 体系结构

来源:互联网 发布:猎流软件是什么 编辑:程序博客网 时间:2024/06/16 12:38

这里写图片描述

连接到数据库时,先创建一个用户进程,用户进程和服务器进程建立连接,随后服务器进程创建与实例的会话。当服务器进程启动的时候分配程序全局区(PGA:program global area)。主要服务于具体的单个用户。SGA(system global area)当实例创建时分配,服务于具体实例。

用户进程:在用户请求连接到Oracle服务器的时候开始
服务器进程:当一个用户建立一个会话的时候启动并连接到数据库实例
后台进程:数据库实例启动的时候同时启动,物理结构和内存结构之间的关系由Oracle后台进程来维护

SGA有几个内存结构组成:共享池,数据库高速缓存,重做日志缓存其它结构(例如锁和闩锁,数据状态)以及两个可选的内存结构,大池和JAVA池。由SGA的组件以细粒(Granule)为单位进行分配和跟踪,大小由SGA_MAX_SIZE指定,是一块连续分配的内存空间。可在sqlplus下通过show sga查看各区域大小。
这里写图片描述

共享池中包含Library Cache和Data Dictionary Cache。大小由SHARED_POOL_SIZE确定。可通过SQL语句:ALTER SYSTEM SET
SHARED_POOL_SIZE = 64M;修改。库缓存储存最近执行过的SQL和PL/SQL语句信息。由LRU算法管理。数据字典缓存收集了最近使用过的数据库中的定义。

设置SGA有利于提升SQL语句的处理速度,这里需要引申软解析和硬解析的概念。解析包括验证语法的正确性,检验提及的对象,确认权限,查看该语句之前是否执行过等。若执行过,则oracle会将之前解析的信息取回并重用(借助LibraryCache),硬解析则是解析过去没有执行的语句。因此,硬解析的工作量比软解析多。可以通过查询v$sql视图查看当前存放在库高速缓存中的语句。但库缓存中,包括大小写在内的不同都会导致oracle认为是不同的SQL而去执行硬解析。因此,可以通过绑定变量的方式,减少硬解析。为了避免多线程并行可能带给LibraryCache的损坏,oracle采用互斥锁(而非锁存器)来解决多线程访问库缓存的问题。

块是oracle进行操作的最小单位,里面含有表数据行or索引条目or排序的临时数据。块典型的大小有4kb,8kb或16kb,取决因素是操作系统。

数据库高速缓冲区(DataBase Buffer Cache)储存了从数据文件中检索到的数据块的镜像拷贝,避免每次硬盘检索耗费大量的时间。通过LRU算法管理,可通过修改DB_BLOCK_SIZE来修改大小。它由独立的子缓冲组成:DB_CACHE_SIZE,DB_KEEP_CACHE_SIZE和DB_RECYCLE_CACHE_SIZE,数据库高速缓冲可以用ALTER SYSTEM命令来动态设置大小尺寸。

重做日志缓冲区(Redo Log Buffer)记录了数据库数据块的所有改变
主要是为了恢复数据,由LOG_BUFFER定义大小。

大池和JAVA池为可选的内存结构。大池只有在共享服务器环境才会配置,它为共享池减轻负担,这个内存区域主要用于会话内存(UGA),不像共享池,大池不使用LRU列表,由LARGE_POOL_SIZE定义大小。JAVA池为JAVA命令的解析要求服务,如果安装了和使用JAVA的话就需要JAVA池,它的储存方式跟PL/SQL储存在数据库表中十分相似由参数JAVA_POOL_SIZE指定大小。

PGA是为每个连接到Oracle数据库的用户进程所保留的内存空间
当进程创建时分配,当进程中止时释放,只能为单个进程使用。

具体后台进程作用及流程留待添加。

查询转换:进行查询语法和权限检验后,优化器会依照算法对语句进行检验,优化sql语句,可能会重写查询,但不会影响结果集。最常见的改变就是将独立的查询块转换为直接联结。如:
select * from employees where department_id in (select department_id from departments)
改为:
select * from employees e,departments d where e.department_id =d.department_id
优化器主要通过视图合并,子查询解嵌套,联结消除,排序消除,谓语前推,使用物化视图重写查询等方式优化。

SQL语句的执行过程

1 0
原创粉丝点击