sql执行原理

本文详细介绍了SQL提交后在数据库端的执行流程,包括查询高速缓存、语法检查、语义检查等六个步骤,以及SGA、PGA等关键概念的解释。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、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
        基于规则的优化器
二、每一步操作在具体哪个组件或者哪个区域执行

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值