无论开发、管理、优化还是设计,基本原理都是必学的。而基本原理中,体系结构又是首当其冲需要了解的知
识。这几天看了一些关于oracle的文档,跟大家分享一下。
先上一张体系结构图,从宏观上把控一下,对Oracle的体系结构有个印象。
Oracle由实例和数据库组成。
实例是由一个开辟的共享内存区SGA(System Global Area)和一系列后台进程组成的,其中SGA最主要被划分为
共享池(shared pool)、数据缓冲区(db cache)和日志缓冲区(log buffer)三类。后台进程主要包括PMON、SMON、
LCKn、RECO、DBWR、LGWR、ARCH等系列进程。
数据库是由数据文件、参数文件、日志文件、控制文件、归档日志文件等系列文件组成的。其中归档日志最终可
能会被转移到新的存储介质中,用于备份恢复使用。
还有一块区域PGA(Program Global Area),PGA也是一块开辟出来的内存区,不同于SGA的是PGA不是共享的,
它是仅供当前发起用户使用的私有内存空间。用于对于数据库发起的无论查询还是更新的任何操作,都是在PGA先预
处理,然后进入实例区域,由SGA和系列后台进程共同完成用户发起的请求。
首次执行一条SQL命令,首先从磁盘中读取用户连接信息和相关权限信息,并保存在PGA内存里,当再次执行该命
令时,只要该SSESSION不断开连接,连接信息和相关权限直接从PGA内存中读取,减少了物理读。
由此得出,PGA的作用(预处理):
1)、保存用户的连接信息,如会话属性、绑定变量等。
2)、保存用户权限等重要信息,当用户进程与数据库建立会话时,系统会将这个用户的相关权限 查询出来,然后
保存在这个会话区内。
3)、当发起的指令需要排序的时候,PGA正是这个排序区。如上图,用户的请求发起经历的顺序一般为:
1区->2区->3区或者1区->2区
通过一条select SQL指令来看一下各区块的合作机制。用户执行该SQL指令时,首先从PGA中做准备工作,同时该
SQL还会立即匹配自己的“身份证”——一条唯一的hash值,接下来进入2区SGA进行处理。首先,进入共享池。该SQL
先查询共享池中是否已经存储过自己的身份证,如果没有那么首先需要查询SQL语句是否正确、语义是否正确、是否
有权限,在这些都没问题的情况下生成这条语句的“身份证”并进行存储。如果找到了匹配的hash值则直接拿来主义
就好了。然后开始进行解析是索引读更高效还是全表扫描更高效。假设比较之后索引读更高效,那么将索引读和生成
的hash值对应在一起进行存储接下来SQL指令就会直奔数据缓存区,在数据缓存区内根据索引列查询满足条件的记
录,但是没有找到怎么办呢?SQL指令继续向上一级3区数据文件区请求,如果找到了就带回数据缓存区,如果还是找
不到那么请求结束,将返回结果给用户。到此一条最普通的SQL指令的执行就结束了。
简单概述:PGA是私有缓存区,主要缓存用户的登录信息和权限信息,必须是一对一的。SGA则是public属性的共
享内存区。执行一条查询命令,如果是第一次执行,共享池和缓冲区内肯定没有缓存的信息,那么执行顺序为:
从磁盘读连接信息、权限保存到PGA,然后到共享池进行“安检”,“安检”通过后给你分发一个“通行证”进行存
储,然后到数据缓存查不到结果继续到数据库的数据文件中查询。
如果是第二次执行,已经有了通行证则不用再次进行“安检”,直接进入数据缓存区查询结果即可。执行顺序为:
PGA->SGA。
通过select命令简单介绍了PGA、SGA、共享池和数据缓存区的概念,接下来会继续讲解其他几个文件和各个进
程的工作机制。欢迎继续关注。