一、SQL提交后在数据库端都执行哪些操作后返回数据给客户端
步骤:
1.查询高速缓存区
2语法检查
检查逗号啊,拼写啊,关键词缺不缺啊之类的
3.语义检查
检查表存在嘛,字段存在嘛之类的
4.获取对象锁
在访问这个表的这段时间,这个表是不允许被drop的,那可以对数据进行增删改查嘛
5.权限核对
有没有权限查
6.确定执行计划
相关名词解释:
1.SGA
是系统全局内存区域
存放从硬盘读取出来之后的或者写入硬盘之前的数据块
2.PGA
是程序共享内存区域或者进程共享内存区域,每一个进程都会被分一块PGA
3.共享池
缓存程序数据的地方
4.库高速缓存
oracle将解析后的sql语句存放在共享池中的库高速缓存中,sql在被执行前会先查库高速缓存,看是否有同样的语句,如果有,执行,无,解析并放入库高速缓存
高速缓存满了,采用最近最少未使用算法将老的踢出去,新的放进来
在 v$sql里面可以查看库高速缓存中的语句
高速缓存存的是什么
服务器进程把这个SQL语句的字符转化为ASCII等效数字码,接着这个ASCII码被传递给一个HASH函数,并返回一个hash值
然后服务器进程将到shared pool中的library cache(高速缓存)中去查找是否存在相同的hash值
查出来的结果是什么
解析后并优化后的sql,生成好的执行计划,检查好的语法语义权限,反正就是统统准备好,直接执行就行了
5.数据字典高速缓存
也在共享池里,存放oracle所使用的系统参数,数据库对象信息
6.软解析
库高速内存中有找到即将被执行的sql,并提取之前的解析信息重用,则称为软解析
7.硬解析
库告诉内存中未找到即将被执行的sql,oracle需要为其生成执行计划,并保存在缓存中以便重用,叫硬解析
这里需要注意,大小写,空格,注释等都会影响这段sql能不能在库高速缓存区内找到,所以代码风格的一致,是很重要的
8.锁存器
防止两个会话同时对一个内存信息进行修改时获取的锁,为了读取内存结构信息
锁存器并不是一个队列,oracle会一直轮询这个锁,看是不是空闲,直到空闲为止,才会执行你的sql
如果一直繁忙并且轮询次数超过了规定次数(可设,在_spim_count 默认2000)
那么就会暂停排到后面,直到再次轮到他使用cpu,并继续轮询锁存器是否空闲,加之锁存器时串行的。。。就更慢了
所以要尽量避免使用锁存器,也就是尽量避免硬解析
sql查询时访问较少的数据块就可以使用较少的锁存器,但是如何访问较少的数据块呢???
所以函数的复用可以减少硬解析嘛???
9.块
就是block,oracle进行操作的最小单位,操作系统时唯一可以限制块大小的因素
10.逻辑读
数据块已经在缓冲区了,就叫逻辑读
11.物理读
数据块需要从磁盘写到缓冲区再被读到,就叫物理读
12.CBO
基于成本的优化器 基于代价的优化器
13.RBO
基于规则的优化器
二、每一步操作在具体哪个组件或者哪个区域执行
sql执行原理
最新推荐文章于 2025-03-18 22:48:17 发布