43.一条语句在oracle中是怎样执行的呢?
Stages of SQL processing
上面是oracle官网给的一条sql语执行的流程,我们来看看它是怎样执行的?
1.sql解析
sql处理的第一阶段就是sql解析,当应用程序发出sql语句时,该应用程序向数据库发出一个解析调用,以准备执行该语句,解析调用会打开或创建一个游标,游标是特定会话的私有sql区域的句柄,其中包含了已分析的sql语句和其他处理信息。游标和私有sql区域位于PGA中。解析调用期间,数据库执行以下检查:
- 语法检查 ----> 指的是sql语句写的是否有问题(比如说select、from 等关键字有没有写错)
- 语义检查 ----> 指的是所要查询的对象是否存在,且是否对对象有操作的权限等。
- 共享池检查
共享池检查指的是检查共享池中是否存在相同的hash值,通常在第一次执行时,数据库使用哈希算法会为每个sql语句生成一个哈希值,也就是sql_id, 可以在v$sql视图中查看。当用户提交sql语句,数据库会搜索共享sql区域,查看现有的已解析语句是否具有相同的hash值,如果存在,那么找到这个hash值对应的执行计划,然后按照这个执行计划去执行这条sql语句
Hard parse(硬解析)
如果数据库不能在pga或者sga中的library cache中找到已经存在该语句的hash值时,it must bulid a new executable version of application code, 这个操作就被称为一个hard parse,在硬解析的过程中,数据库会多次访问库缓存和数据字典缓存以检查数据字典,当数据库访问这些区域时,它在所需要对象上使用一个叫 latch锁以便于他们在定义时不会被修改,latch锁的争用会增加语句执行时间并降低并发性。
Soft parse(软解析)
不是硬解析的全都是软解析,如果提交的sql语句已经在shared pool中,oracle将会重用这个已经existing code, this reuse of code is also called a library cache hit.
一般地,软解析比硬解析更好,因为数据库可以跳过the optimization and row source generation steps,然后可以直接执行。
下面是一个在直连的server架构中update一条语句,在shared pool check的一个流程
如果检查确定共享池中的语句具有相同的散列值,则数据库将执行语义和环境的检查,已确定语句是否有相同的含义,
2.Sql Optimization
sql optimization 是选择执行sql语句的最有效方法的过程,数据库根据收集到的有关正在访问的实际数据的统计信息优化查询,优化器使用行数,数据集的大小和其他因素来生成可能的执行计划,并为每个计划分配一个数字成本,数据库使用成本最低的方案。
数据库必须对每个唯一的DML语句至少执行一个硬解析,并在此解析期间执行优化。DDL永远被优化,除非它包含需要优化的DML组件,比如子查询。
3. SQL Row Source Generation
The row source generator is software,它从优化器接受最优执行计划,并且生成一个迭代计划(call query plan),该计划可供数据库的其余部分使用,the iterative plan is a binary program,当有sql virtual machine 执行时,将产生结果集。
行源是执行计划中的步骤返回的行集,以及可以迭代处理行的控制结构,行源可以是表,视图或连接或分组操作的结果。
行源生成器生成行源树,它是行源的集合,行源树中包括如下信息:
- 语句引用的表的顺序
- 语句中提到的每个表的访问方法
- 一个连接方法,用于受语句中连接操作影响的表
- 数据操作,如筛选、排序或聚合
4. SQL Execution
在执行期间,sql引擎将会执行 row source generatior 生成的每一个row source,然后将执行过的结果返回给客户端。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 一文读懂知识蒸馏
· 终于写完轮子一部分:tcp代理 了,记录一下
2021-08-26 13.安装上传和下载文件
2021-08-26 12.yum install 和yum localinstall区别