Oracle学习笔记--系列一(9)

(9)SQL语句执行过程剖析

在这里插入图片描述

视频链接:
https://www.bilibili.com/video/BV1Zt411w7eQ?p=11

在这里插入图片描述

SQL语句的执行过程

  • 用户连接到实例后,实例会针对该连接专门开一个进程Server Process(前台进程/服务器进程),单独分配PGA空间。

例句:select * from dba_data_files;

  • 在客户端输入一条SQL语句,回车后,SQL语句通过网络连接送到实例,送到实例后,由Server Process接收,Server Process接收到SQL语句后,oracle虽然认识sql语句,但是不能直接执行。接下来会进行如下操作:
    1)将sql语句进行解析(消耗很多资源:CPU、IO);
    2)生成执行计划,然后才能执行。

问题:
有没有必要对sql语句及sql语句执行计划进行缓存?
答:有必要。缓存在shared pool中。

server process接收到process后,1)会拿着sql语句进入shared pool,先检查在shared pool中是否有该语句的缓存,如果有,server process会在shared pool中找到这条sql语句以及对应的执行计划,然后执行sql语句。如果没有缓存。server process会进行一系列的操作,将sql语句进行解析,生成执行计划,然后执行语句。(找–解析)
2)server process根据执行计划执行语句,需要取dbf文件数据(database buffer cache用来缓存dbf的数据),server process会先在buffer cache中找是否有表对应的数据,如果有,server process直接访问buffer cache,取出所需数据,然后通过网络返给客户端。如果没有,server process会到dbf文件中找,从dbf中将数据取出来,放到buffer cache,然后再从buffer cache中返给用户。(逻辑读/内存读、物理读/磁盘读)

有必要缓存dbf文件数据吗?
答:有必要。因为A用户访问了某个表,B用户访问该表的概率就很大,A用户再次访问该表的概率也很大,如果没有database buffer cache,每次访问dbf时都要发生物理IO,影响数据库性能。

命中率=L/(L+P)
vmstat 1 10 --linux命令
重要参数:
tps:每秒传输次数
。。。。。
iostat 1 10 --linux命令`

如果sql语句是对数据进行修改呢?
现假设要修改某张表的数据。
2)server process在内存(buffer cache)中对表数据进行修改,修改时会产生日志(server process产生的),产生的日志会写到redo log buffer,此时内存中的数据和dbf中的不一致,所以需要将修改后的数据写回dbf(由DBWRr写:DBWR负责jiangserver process修改的数据写回磁盘)。redo log buffer中的日志由LGWR写入redo log文件。

DBWR和LGWR比较忙

CKPT:周期性运行,把数据库当前的状态信息写到控制文件和数据文件的头部(更新控制文件和数据文件的头部)

SMON:对数据库实例内部进行清理和维护(举例:shared pool使用时间久了可能会产生一些碎片,SMON会对这些碎片进行整合)(主内)

PMON:对server process进行维护(举例:客户端网络突然断了,但对应的server process 还在,PMON会周期性的启动,如果发现某个server process对应的客户端已经死掉了,会把该server process进行清理(关掉server process、清理server process对应的PGA空间))。(主外)

归档日志:ARCn进程将在线日志写入归档日志。
在这里插入图片描述
在这里插入图片描述
Pinned:读写的瞬间


上一篇:Oracle学习笔记–系列一(8)
下一篇:Oracle学习笔记–系列一(10)

おすすめ

転載: blog.csdn.net/Ruishine/article/details/120742375