首页 > 代码库 > Oracle是如何工作的?实例是如何响应用户请求?一条SQL的执行过程~

Oracle是如何工作的?实例是如何响应用户请求?一条SQL的执行过程~

Oracle 是如何工作的?

 

  • Select idname from t order by id ;

– SQL 解析(查看语法是否错误,如果没有错误,分析语意,执行此语句的权限)

执行计划ORACLE如何访问数据,按照执行计划取数据)

执行SQL

从磁盘中读取数据(如果数据在内存中没有,就去磁盘读取)

数据处理(数据读到内存后,就进行处理。排序,组合等处理)

返回结果(把结果返回给用户)

 

 

  • Insert into t values(1,‘tigerfish’);

– SQL 解析

执行计划

执行SQL

从磁盘中读取数据块(如果内存中没有)

修改回滚段数据块(同时产生redo log)----Oracle特性(将数据修改前的数据放到回滚数据块)

修改原始数据块(同时产生redo log

 

  • Create table t values(id int,name varchar2(10);

– SQL 解析

执行计划

执行SQL

给对象分配初始化的存储空间(段),产生一些undoredo日志。

Oracle字典表中创建新的对象相关信息(表,字段,各种属性….),产生一些Undoredo日志。

 

  • Drop table t purgetruncate table t);

– SQL 解析

执行计划

执行SQL

收回对象占用的空间,产生一些undoredo日志。

Oracle字典表删除的对象的相关信息(表,字段,各种属性….),产生一些Undoredo日志。

 

 

 

实例是如何响应用户请求?

  1. Client Process(用户端进程)向数据库发了一条SQL语句.
  2. 数据库端会启用一个Server Process(服务器进程).
  3. Client ProcessServer Process组成了一个Session(会话).
  4. Server Process就会处理用户的请求.
  5. Server Process会开一块内存(PGA,用户的请求(SQL语句)首先会放在PGA.
  6. Server Process开辟了内存后就要开始执行SQL语句了.这时候就需要去访问SGA.
  7. 访问SGA,首先去Share Pool解析SQL语句,得到执行计划,然后按照执行计划去Database Buffer Cache查找数据.
    1. 如果Database Buffer Cache没有,Server Process就直接去磁盘里面读数据到Database Buffer Cache.
    2. 如果Database Buffer Cache里读到了数据,用户需要修改数据块,那么就会在Database Buffer Cache里修改数据块.
      1. 修改数据块后会产生redo logredo log Buffer会产生响应的重做项。
      2. 如果用户发出commit的提交,redo log Buffer会通过LGWR进程将数据写到磁盘上.
      3. 如果用户发出了checkpoint检查点,数据会被DBWn进程会将修改了的脏数据(当buffer cache被修改了就会标记为脏数据)写入磁盘上.

技术分享

技术分享

技术分享

 

一条SQL的执行过程:

  1. 客户端发出请求(update set id=1),连接监听器,监听器将服务转到实例上,ORACLE启动服务器进程,和客户端进程建立连接,就完成了一个会话.
  2. ORACLE服务器进程SQL语句在Share pool里面进行解析(语法分析、语义分析(权限啊,表是否存在),生成执行计划)
  3. ORACLE服务器进程按照执行计划访问数据,先到db buffer里面找数据块.如果有就对数据库做update
  4. 如果db buffer里面没有,就会从磁盘相应的数据文件中找.再把数据读到db buffer里面去.就可以修改数据块了.
  5. 修改数据时会产生一个undo数据(重做数据).(如之前的id=99,那么id=99的数据块就会被放到undo表空间去,方便回滚),然后修改当前的数据块为1.
  6. 客户端提交commit命令.
  7. LGWRundo产生的日志和当前数据块修改产生的日志放在一起,写在磁盘上.
  8. 客户端发出alter system checkpointDBWR将内存中的脏数据写到磁盘上.
技术分享

 


Oracle是如何工作的?实例是如何响应用户请求?一条SQL的执行过程~