首页 > 数据库 >Oracle SQL语句执行步骤

Oracle SQL语句执行步骤

时间:2023-04-02 11:32:24浏览次数:31  
标签:语句 cache library SQL Oracle 解析


Oracle SQL语句执行步骤




Oracle中SQL语句执行过程中,Oracle内部解析原理如下:

1、当一用户第一次提交一个SQL表达式时,Oracle会将这SQL进行Hard parse,这过程有点像程序编译,检查语法、表名、字段名等相关信息(如下图),这过程会花比较长的时间,因为它要分析语句的语法与语义。然后获得最优化后的执行计划(sql plan),并在内存中分配一定的空间保存该语句与对应的执行计划等信息。

2、当用户第二次请求或多次请求时,Oracle会自动找到先前的语句与执行计划,而不会进行Hard parse,而是直接进行Soft parse(把语句对应的执行计划调出,然后执行),从而减少数据库的分析时间。

注意的是:Oracle中只能完全相同的语句,包大小写、空格、换行都要求一样时,才会重复使用以前的分析结果与执行计划。

分析过程如下图:

对于大量的、频繁访问的SQL语句,如果不采用Bind 变量的方式,哪Oracle会花费大量的Shared latch与CPU在做Hard parse处理,所以,要尽量提高语句的重用率,减少语句的分析时间,通过了解Oracle SQL语句的分析过程可以明白Oracle的内部处理逻辑,并在设计与实现上避免。

在用JDBC或其它持久化数据(如Hibernate,JDO等)操作时,尽量用占位符(?)

 

ORACLE sql 的处理过程大致如下:
1.运用HASH算法,得到一个HASH值,这个值可以通过V$SQLAREA.HASH_VALUE 查看
2.到shared pool 中的 library cache 中查找是否有相同的HASH值,如果存在,则无需硬解析,进行软解析
3.如果shared pool不存在此HASH值,则进行语法检查,查看是否有语法错误
4.如果没有语法错误,就进行语义检查,检查该SQL引用的对象是否存在,该用户是否具有访问该对象的权限
5.如果没有语义错误,对该SQL进行解析,生成解析树,执行计划
6.生成ORACLE能运行的二进制代码,运行该代码并且返回结果给用户
硬解析和软解析都在第5步进行
硬解析通常是昂贵的操作,大约占整个SQL执行的70%左右的时间,硬解析会生成执行树,执行计划,等等。
当再次执行同一条SQL语句的时候,由于发现library cache中有相同的HASH值,这个时候不会硬解析,而会软解析,
那么软解析究竟是干了什么呢?其实软解析就是跳过了生成解析树,生成执行计划这个耗时又耗CPU的操作,直接利用生成的执行计划运行
该SQL语句。
下面摘抄eygle深入解析ORACLE 中关于SQL执行过程的描述
  1.首先获得library cache latch,根据SQL的HASH_VALUE在library cache中查找是否存在此HASH_VALUE,如果找到这个HASH_VALUE,称之为软解析,Server获得改SQL执行计划转向第4步,如果找不到共享代码就进行硬解析。
  2.释放library pool cache,获得shared pool latch,查找并锁定自由空间(在bucket 中查找chunk)。如果找不到,报ORA-04031错误
  3.释放shared pool latch,重新获得library cache latch,将SQL执行计划放入library cache中。
  4.释放library cache latch,保持null模式的library cache pin/lock.
  5.开始执行。
Library cache latch可以理解为硬/软解析的时候发生的,因为解析的时候会搜索library cache,所以会产生library cache latch
Library cache pin 是在执行的阶段发生的。



标签:语句,cache,library,SQL,Oracle,解析
From: https://blog.51cto.com/u_548275/6164521

相关文章

  • 远程服务器(腾讯云轻量服务器)上安装SQL Server以及SQL Server Management Studio,以及EF
    SQLServer的安装下载地址:https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads安装教程参考:https://blog.csdn.net/qq_51929833/article/details/122625809其中,这一步非常关键,因为在后续SSMS中,选用"SQLServer身份验证"时候的密码,默认用户名都是"sa"SQLServe......
  • 力扣610(MySQL)-判断三角形(简单)
    题目:表: Triangle写一个SQL查询,每三个线段报告它们是否可以形成一个三角形。以 任意顺序 返回结果表。查询结果格式如下所示。示例1: 解题思路:判断是否形成三角形的准则是:两边之和大于第三边。方法一:casewhen1#WriteyourMySQLquerystatementbelow2select......
  • 力扣608(MySQL)-树节点(中等)
    题目:给定一个表 tree,id 是树节点的编号, p_id 是它父节点的 id。 树中每个节点属于以下三种类型之一:叶子:如果这个节点没有任何孩子节点。根:如果这个节点是整棵树的根,即没有父节点。内部节点:如果这个节点既不是叶子节点也不是根节点。写一个查询语句,输出所有节点的编号......
  • 读SQL进阶教程笔记05_关联子查询
    1. 关联子查询1.1. 关联子查询和自连接在很多时候都是等价的1.2. 使用SQL进行行间比较时,发挥主要作用的技术是关联子查询,特别是与自连接相结合的“自关联子查询”1.3. 缺点1.3.1. 代码的可读性不好1.3.1.1. 特别是在计算累计值和移动平均值的例题里,与聚合一起使用......
  • 在业务中有个SQL语句导致mysql锁表,该SQL为重要业务使用不能kill,解决方案
    在业务中有个SQL语句导致mysql锁表,该SQL为重要业务使用不能kill,怎么快速恢复如果有一个重要业务正在使用导致了MySQL表的锁定,不能通过终止相关的MySQL进程来解除表锁定,需要采取其他措施来快速恢复业务。以下是一些可能有用的步骤:使用MySQL的SHOWPROCESSLIST命令来查看当前正......
  • sql面试题目
    sql逻辑:createtableods.product(product_idint,product_namevarchar(255))ENGINE=InnoDBDEFAULTCHARSET=utf8mb3;insertintoods.productvalues(1,'LCPhone');insertintoods.productvalues(2,'LCT-Shirt');select*fromods.product;cre......
  • Linux服务器MySQL操作总结
    目录1.Navicat连接服务器MySQL2.如何查看MySQL用户名和密码3.修改MySQL的登录密码4.安装MySQL开发包(Centos7版)错误:error1045(28000):accessdeniedforuser'root'@'localhost'(usingpassword:yes)1.Navicat连接服务器MySQL1.选择数据库直接使用第一个MySQL即可......
  • Sql server 查看那个表占用的空间最多
    要查看SQLServer中哪个表占用的空间最多,您可以使用以下查询来列出所有表及其占用的空间大小,并按照占用空间从大到小进行排序: SELECTt.NAMEASTableName,p.rowsASRowCounts,SUM(a.total_pages)*8ASTotalSpaceKB,SUM(a.used_pages)*8ASUsed......
  • sql server 收缩日志文件
    在SQLServer中,可以使用DBCCSHRINKFILE命令来收缩数据库的事务日志文件。下面是一个示例:USE<database_name>GO--收缩日志文件DBCCSHRINKFILE(<log_file_name>,<target_size_in_MB>)其中,<database_name>是要操作的数据库名称,<log_file_name>是要收缩的事......
  • Linux下编译Sqlite源码
    1.下载wgethttps://www.sqlite.org/2023/sqlite-autoconf-3410200.tar.gz--no-check-certificate2.解压tarzxvfsqlite-autoconf-3410200.tar.gz 3.配置路径cdsqlite-autoconf-3410200/./configure--prefix=/data/sqlite#先建立该路径 4.编译make&&ma......