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,然后将执行过的结果返回给客户端。

参考:https://docs.oracle.com/en/database/oracle/oracle-database/19/cncpt/sql.html#GUID-FC019793-FC08-46DB-A74C-8BF6C60ACECB

posted on   太白金星有点烦  阅读(47)  评论(0编辑  收藏  举报

相关博文:
阅读排行:
· 无需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区别

导航

< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5
点击右上角即可分享
微信分享提示