Oracle数据库简单查询的流程

首先看oracle的物理体系结构图,如下

Oracle数据库简单查询的流程_第1张图片

对于上图,简要的五点:

①Oracle由实例和数据库组成

②实例是由一个开辟的共享内存区SGA(system global area)和一系列后台进程组成的,其中SGA最主要被划分为共享池(shared pool)、数据缓冲区(db cache)和日志缓冲区(log buffer)三类。后台进程包括PMONsmon,lckn,reco.ckpt,dbwr,lgwr,arch等系列进程。

③数据库是由数据文件、参数文件、日志文件、控制文件、归档日志文件等系列文件组成的,其中归档日志最终可能被转移到新的存储介质中,用于备份恢复使用。

PGA(program global area)区,这也是一块开辟出来的内存区,和SGA最明显的差别在于,PGA不是共享内存,是私有不共享的,S理解为共享的首字母。用户对数据库发起的无论查询还是更新的任何操作,都是在PGA先预处理,然后接下来才进入实例区域,由SGA和系列后台进程共同完成用户发起的请求。

PGA起到的具体作用,也就是前面说的预处理,是什么呢?主要有三点:第一,保存用户连接的信息,如会话属性、绑定变量等,第二,保存用户权限等重要信息,当用户进程与数据库建立会话时,系统会将这个用户的相关权限查询出来,然后保存在这个会话区内;第三,当发起的指定需要排序的尺寸,PGA正是这个排序区,如果在内存中可以放下排序的尺寸,就在内存PGA区内完成,如果放不下,超出的部分就在临时表空间完成排序,也就是在磁盘中完成排序。

1区圆形虚线框,2区直角方形虚线框,3区圆角方形虚线框。用户请求发起经历的顺序一般如下:1---2-----3;或者1-----2.

Oracle的体系架构

先看一条最简单的SQL查询语句select object_name from t where object_id=29;当发出这个指令后,该SQL先从1区先准备工作。

前面我们向大家描述PGA不同于SGA,是仅供当前发起用户使用的私有内存空间,这个区域的具体作用有三点(上面红色的字体)。这里该连接只是完成了两点,即用户连接信息的保存和权限的保存,只要该session不断开连接,下次系统不用再去硬盘中读取数据,而直接从PGA内存中获取。

此外该SQL还会立即匹配一条唯一的HASH值,接下来该SQL指定进入2区进行处理,首先敲开SGA区共享池的大门,准备登门拜访。

共享池的大门打开了,该SQL先在房内查询是否在什么地方有存储过这个SQL指令的身份证(就是那个唯一的hash),如果没有,那就要首先查询自己的语句语法是否正确(比如from是否写成了form)、语义是否正确(比如id字段根本就不存在)、是否有权限,在这些都没有问题的情况下生成这条语句的身份证,唯一的hash值就被存储下来了。接下来就开始进行解析,解析什么呢?比如select object_name from t where object_id=29 这个语句,在object_id列有索引的情况下,使用索引更高效,还是全表扫描更高效?Oracle要做出选择。

假设oracle认定使用索引代价(COST)更低,于是oracle就选用索引读的执行计划而放弃了全表扫描方式。接下来这个索引读的计划就立即被存储起来,并且和之前存储的该SQL的身份证(唯一HASH)值对应在一起。

接下来,该SQL指令好比钦差大臣一样,手持”索引读获取某某数据”这个圣旨,继续往前走,去哪儿呢?原来是直奔”数据缓冲区

数据缓冲区开门迎接后,立即要根据ID列上的索引从t表中查找object_id值为29的宝物,但是所要的东西在府内找不到,该怎么办?数据缓冲区只好传令下去,去偏远的Database的数据文件区去查找要的东西(当然必须用索引读的方式查找),如果查到了,就带回数据缓冲区府,并由钦差大臣展现给皇上,如果找不到,也只有就此复命。




你可能感兴趣的:(Oracle)