原文链接:https://blog.csdn.net/qq_25186987/article/details/87713668

一、Oracle物理体系

Oracle由实例和数据库组成,其物理体系结构图如下:

 

【收获,不止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

 

相关文章: