原文链接:https://blog.csdn.net/qq_25186987/article/details/87713668
一、Oracle物理体系
Oracle由实例和数据库组成,其物理体系结构图如下:
一区:PGA ( Program Global Area )
PGA是一块开辟出来的私有不共享的内存区,用户对数据库发起的无论查询还是更新的任何操作,都是在PGA先预处理,然后接下来才进入实例区域,由SGA和系列后台进程共同完成用户发起的请求。
PGA的预处理作用:
1)保存用户的连接信息,如会话属性、绑定变量等
2)保存用户权限等重要信息,当用户进程与数据库建立会话时,系统会将这个用户的相关权限查询出来,然后保存在这个会话区内。
3)当发起的指令需要排序的时候,PGA正是这个排序区,如果内存中可以放下排序的尺寸,就在内存PGA中完成,如果放不下,超出的部分就在临时表空间中完成排序,也就是在磁盘中完成排序。
二区:实例 ( instance )
实例是由一个开辟的共享内存区SGA(System Global Area)和一系列后台进程组成的,其中SGA主要被划分为
1)共享池 ( shared pool )
2)数据缓冲区 ( db cache )
3)日志缓冲区 ( log buffer )
后台进程包括图中所示的PMON、SMON、LCKn、RECO、CKPT、DBWR、LGWR、ARCH等。
三区:数据库 (database)
数据库是由数据文件、参数文件、日志文件、控制文件、归档日志文件等系列文件组成的,其中归档日志最终可能会被转移到新的存储介质中,用于备份恢复使用。
总结:
1、用户发起的请求一般经历如下:
一区—>二区—>三区
或者
一区—>二区
例如:一条查询sql:select * from temp where id=1;
①、PGA(当前发起用户私有内存空间,保存用户连接信息和权限,避免每次请求物理读)为SQL指令匹配一条唯一的hash值
②、该SQL指令进入SGA的共享池,池内查询是否存储过该指令的hash值
如果没有,检查语法、语义正确性、权限与否,没有问题后将这条唯一的hash值保存,再进行代价解析
如果有,跳过检查、代价解析操作,直接进入数据缓存区或者数据库文件
③、进入数据缓存区根据代价解析结果,查询数据缓存区是否存有该请求结果
如果没有,进入database数据文件区查找结果,并将查询结果带回数据缓存区(避免下次查询物理读)
如果有,直接返回查询结果
例如一条更新语句:update temp set id =29 where id=92;
前三个步骤同查询语句没有差别
④、查询结果返回SGA数据缓存区后在里面修改完数据后,会启用DBWR进程,完成更新的数据从内存中刷入磁盘,将磁盘中的ID=92的值更新为ID=29