Oracle SQL的硬解析和软解析

Oracle对Sql语句的软解析和硬解析? 经常在论坛中,有人会在针对SQL优化方向提出:要避免SQL进行硬解析,从而提高SQL执行的效率。避免硬解析,确实是高效利用shared_pool的一种重要策略。通常情况下,作为开发人员,我们需要记住,为了最高效的利用共享池,我们编写的sql最好是可以共享的,比如绑定变量就是一个避免硬解析从而提高共享的有效手段。我们举一个相对极端的例子,因为针对一般的DML,Oracle通常都会将其解析为绑定变量的 阅读详情

我们都知道在Oracle中每条SQL语句在执行之前都需要经过解析,这里面又分为软解析和硬解析。在Oracle中存在两种类型的SQL语句,一类为 DDL语句(数据定义语言),他们是从来不会共享使用的,也就是每次执行都需要进行硬解析。还有一类就是DML语句(数据操纵语言),他们会根据情况选择要么进行硬解析,要么进行软解析。

 

DML:INSERT,UPDATE,DELETE,SELECT

DDL:CREATE,DROP,ALTER

 

 

一.  SQL 解析过程

 

Oracle对此SQL将进行几个步骤的处理过程:

    1、语法检查(syntax check): 检查此sql的拼写是否语法。

    2、语义检查(semantic check): 诸如检查sql语句中的访问对象是否存在及该用户是否具备相应的权限。

    3、对sql语句进行解析(prase): 利用内部算法对sql进行解析,生成解析树(parse tree)及执行计划(execution plan)。

    4、执行sql,返回结果(execute and return)

 

 

 

 

 

二. 解析过程详解

 

2.1  语法检测

判断一条SQL语句的语法是否符合SQL的规范,比如执行:

SQL> selet * from emp;

我们就可以看出由于Select关键字少了一个“c”,这条语句就无法通过语法检验的步骤了。


 

 

2.2 语义检查

语法正确的SQL语句在解析的第二个步骤就是判断该SQL语句所访问的表及列是否准确?用户是否有权限访问或更改相应的表或列? 比如如下语句:

SQL> select * from emp;

select * from emp

*

ERROR at line 1:

ORA-00942: table or view does not exist

由于查询用户没有可供访问的emp对象,因此该SQL语句无法通过语义检查。


 

 

2.3 解析(Parse)

 

  2.3.1 Parse主要分为三种:

    1、Hard Parse (硬解析)

    2、Soft Parse (软解析)

    3、Soft Soft Parse(好像有些资料中并没有将这个算在其中)

 

   Hard Parse: 就是上面提到的对提交的Sql完全重新从头进行解析(当在Shared Pool中找不到时候将会进行此操作),总共有一下5个执行步骤:

    1:语法分析

    2:权限与对象检查

    3: 在共享池中检查是否有完全相同的之前完全解析好的. 如果存在,直接跳过4和5,运行Sql, 此时算soft parse.

    4:选择执行计划

    5:产生执行计划

 

注:创建解析树、生成执行计划对于sql的执行来说是开销昂贵的动作,所以,应当极力避免硬解析,尽量使用软解析。这就是在很多项目中,倡导开发设计人员对功能相同的代码要努力保持代码的一致性,以及要在程序中多使用绑定变量的原因。

 

Soft Parse: 就如果是在Shared Pool中找到了与之完全相同的Sql解析好的结果后会跳过Hard Parse中的后面的两个步骤。

 

    Soft Soft Parse: 实际上是当设置了session_cursor_cache这个参数之后,Cursor被直接Cache在当前Session的PGA中的,在解析的时候只需要对其语法分析、权限对象分析之后就可以转到PGA中查找了,如果发现完全相同的Cursor,就可以直接去取结果了,也就就是实现了 Soft Soft Parse.

 

 

 

2.3.2 解析的步骤可以分为两个步骤:

 

1) 验证SQL语句是否完全一致。

在这个步骤中,Oracle将会对传递进来的SQL语句使用HASH函数运算得出HASH值,再与共享池中现有语句的HASH值进行比较看是否一一对应。现有数据库中SQL语句的HASH值我们可以通过访问v$sql、v$sqlarea、v$sqltext等数据字典中的HASH_VALUE列查询得出。

如果SQL语句的HASH值一致,那么ORACLE事实上还需要对SQL语句的语义进行再次检测,以决定是否一致。那么为什么Oracle需要再次对语句文本进行检测呢?不是SQL语句的HASH值已经对应上了?事实上就算是SQL语句的HASH值已经对应上了,并不能说明这两条SQL语句就已经可以共享了。

 

例如:假如用户SYS有自己的一张表EMP,他要执行查询语句:select * from emp; 用户SYSTEM也有一张EMP表,同样要查询select * from emp;这样他们两条语句在文本上是一模一样的,他们的HASH值也会一样,但是由于涉及到查询的相关表不一样,他们事实上是无法共享的.

 

SQL> conn / as sysdba

已连接。

SQL> show user

USER 为 "SYS"

SQL>  create table emp ( x int ) ;

表已创建。

SQL> select * from emp;

未选定行

SQL> conn system/admin;

已连接。

SQL>  create table emp ( x int );

表已创建。

SQL> select * from emp;

未选定行

SQL> select address,hash_value, executions, sql_text from v$sql where upper(sql_text) like 'SELECT * FROM EMP%';

ADDRESS      HASH_VALUE  EXECUTIONS    SQL_TEXT                                                               

-----------------------  ---------------------------------------------------------

2769AE64    1745700775     1         select * from emp                                                                                                                        

2769AE64    1745700775     1         select * from emp                                                   

2 rows selected.

 

从结果可以看到这2个查询的语句文本和HASH值都是一样的,但是由于查询的对象不同,是无法共享的,不同情况的语句还是需要硬解析的。因此在检查共享池共同SQL语句的时候,是需要根据具体情况而定的。

 

可以进一步查询v$sql_shared_cursor以得知SQL为何不能共享的原因:

 

SQL>select address,auth_check_mismatch,translation_mismatch,optimizer_mismatch

from v$sql_shared_cursor where address in (

select address from v$sql where upper(sql_text) like 'SELECT * FROM EMP%' ) 

 

ADDRESS     A T O

----------------  ----- -- --

2769AE64     N N N

2769AE64     Y Y N

 

TRANSLATION_MISMATCH 表示SQL游标涉及到的数据对象是不同的;

AUTH_CHECK_MISMATCH 表示对同样一条SQL语句转换是不匹配的。

optimizer_mismatch 表示会话的优化器环境是不同的。

 

 

 

2)  验证SQL语句执行环境是否相同

 

比如同样一条SQL语句,一个查询会话加了/*+ first_rows */的HINT,另外一个用户加/*+ all_rows */的HINT,他们就会产生不同的执行计划,尽管他们是查询同样的数据。

 

通过如上检查以后,如果SQL语句是一致的,那么就会重用原有SQL语句的执行计划和优化方案,也就是我们通常所说的软解析。如果SQL语句没有找到同样的副本,那么就需要进行硬解析了。

 

Oracle根据提交的SQL语句再查询相应的数据对象是否有统计信息。如果有统计信息的话,那么CBO将会使用这些统计信息产生所有可能的执行计划(可能多达成千上万个)和相应的Cost,最终选择Cost最低的那个执行计划。如果查询的数据对象无统计信息,则按RBO的默认规则选择相应的执行计划。这个步骤也是解析中最耗费资源的,因此我们应该极力避免硬解析的产生。至此,解析的步骤已经全部完成,Oracle将会根据解析产生的执行计划执行SQL语句和提取相应的数据。

 

2.4  执行sql,返回结果(execute and return)

 

 

 

 

三.  绑定变量

   

    使用了Bind Var能提高性能主要是因为这样做可以尽量避免不必要的硬分析(Hard Parse)而节约了时间,同时节约了大量的CPU资源。

 

    当一个Client提交一条Sql给Oracle后,Oracle 首先会对其进行解析(Parse),然后将解析结果提交给优化器(Optimiser)来进行优化而取得Oracle认为的最优的Query Plan,然后再按照这个最优的Plan来执行这个Sql语句(当然在这之中如果只需要软解析的话会少部分步骤)。

 

但是,当Oracle接到 Client提交的Sql后会首先在共享池(Shared Pool)里面去查找是否有之前已经解析好的与刚接到的这一个Sql完全相同的Sql(注意这里说的是完全相同,既要求语句上的字符级别的完全相同,又要求涉及的对象也必须完全相同)。当发现有相同的以后解析器就不再对新的Sql在此解析而直接用之前解析好的结果了。这里就节约了解析时间以及解析时候消耗的CPU资源。尤其是在OLTP中运行着的大量的短小Sql,效果就会比较明显了。因为一条两条Sql的时间可能不会有多少感觉,但是当量大了以后就会有比较明显的感觉了。

 

 

 

注:整理自网络

 

本文来自优快云博客,转载请标明出处:http://blog.youkuaiyun.com/tianlesoftware/archive/2010/04/08/5458896.aspx

Oracle SQL的硬解析和软解析以及MySQL 硬解析和软解析是数据库查询优化和执行过程中的重要概念。在本文中,我们将探讨Oracle SQL和MySQL中的硬解析和软解析的概念、区别以及如何进行性能优化。 阅读详情

相关推荐

oracle sql语句执行流程解析

该文档详细介绍了一条sql从应用端提交开始,在数据库中的执行过程,sql的执行原理等,能够更有效的帮助你oracle数据库以及更有效的提高sql优化的能力。

oracle的sql硬解析和软解析,[ORACLE]oracle SQL执行过程 软解析(soft prase)硬解析(hard prase)以及 Soft Soft Parse...

每个sql会产生两个share cursor 父游标(parent cursor)和子游标(child cursor) ,缓存在库缓存区的对象都是以一种叫库缓存对象句柄(library cache object handle)的结构存存储在库缓存中,oracle就是通过访问相关的库缓存对象句柄来访问对应的库缓存对象的,上面的每一个红圈里的方块就是一个库缓存对象句柄名词解释:hash buck...

weixin_39893042的博客 290

oracle sql执行过程(流程图)

Oracle sql执行流程图_SQL执行过程一、sql语句的执行步骤:1)语法分析,分析语句的语法是否符合规范,衡量语句中各表达式的意义。2) 语义分析,检查语句中涉及的所有数据库对象是否存在,且用户有相应的权限。3)视图转换,将涉及视图的查询语句转换为相应的对基表查询语句。4)表达式转换, 将复杂的 SQL 表达式转换为较简单的等效连接表达式。5)选择优化器,不同的优化器一般产生不同的“执行计划”  6)选择连接方式,ORACLE有三种连接方式,对多表连接ORACLE可选择适当的连接方式。7)选择连接顺序,对多表连接ORACLE选择哪一对表先连接,选择这两表中哪个表做为源数据表。8)选择数

Oracle中执行SQL过程

SQL执行过程的图大同小异,我们今天主要说执行器,因为执行器中执行计划是非常重要的,它可以辅助我们继续SQL优化,检查SQL语句BUG。目前一般开发人员【不包含DBA和资深数据开发人员】使用最多的就是PLSQL,而PLSQL本身自带查看执行计划的按钮,所以不过多说明。此处用NAVICAT说明: 第一步:EXPLAIN PLAN FOR 第二部:写sql语句 第三步:SELECT * FROM TABLE(dbms_xplan.display); 如下图: 通过上图查看执行计划表可以发现一些字段,我们逐个进

qq_15765269的博客 2704

机器学习的学习准则(期望风险最小化、经验风险最小化、结构风险最小化)

要评价模型f(x, θ)的好坏,可通过期望风险R(θ)来衡量:求期望损失R(θ)不仅需要知道损失函数还需要知道真实分布,损失函数可以通过一定的准则计算得到,但是样本空间的真实分布是未知的。所以不能直接求R(θ)。期望风险R(θ)无法计算,给定一个训练集D =,我们可以计算经验风险,经验风险就是在训练集上的平均损失:为了解决过拟合问题,引入了参数正则化来限制模型的能力。使其不要过度的最小化经验风险。这种准则就是结构风险最小化准则

... 2225

影像组学分析流程中,图像分割前要做的事(图像预处理)

在InputVolume中无法找到自己想要重采样的序列,这时可以检查一下序列的Volume type是不是MRMLMulti。这时,Volume type将由MRMLMulti改为Scaler,随后即可在3D slicer中完成Resample Scaler Volume。2.1、重采样:通过3Dslicer中的Resample Scaler Volume实现。具体设置参数:spacing(1,1,1),Interpolation选择Bspline。2、图像预处理:重采样和标准化。

weixin_45011313的博客 3724

【Oracle】SQL执行过程

流程图 执行过程 建立连接 用户在客户端输入执行SQL,该SQL语句通过session传输到服务器端,服务器通过Server Process接收SQL语句。客户端无需再做其他的操作,只是将SQL语句发送给服务端。 查看Lib Cache 服务器进程在接到客户端传送过来的 SQL 语句后,不会直接去数据库查询。服务器进程会把这个 SQL 语句的字符进行转码,将转码后的值传递给一个 HASH 函数,并返回一个 hash 值,然后服务器进程将到 shared pool 的 library ca

As before 如初 972

VSCODE 安装LATEX环境,参数配置,常见问题解决

1 准备Texlive安装包 可以从以下网址下载 texlive 的镜像文件: 华为镜像 阿里镜像 官网 网址中大概文件构成 下载完后我们需要的文件构成(我是2020年下载过了,这次就不重新下载了) 将这个镜像文件进行解压 2 安装Texlive 右键install-tl-windows.bat,单击以管理员身份运行,进入安装界面. 点击左下角的“Advanced”进入高级安装来取消你不需要安装的宏包。 点击“Customize”来取消勾选不需要的宏包。 单是把非中英的语言包取消勾选可以省掉 1G

呆呆象呆呆的博客 6万+

Oracle执行SQL查询语句的步骤

查询语句的处理主要包括三个阶段: 1、编译(parse):在进行编译时,服务器进程会将SQL语句的正文放入共享池的库高速缓存中并完成相应的处理。 2、执行(execute):Oracle服务器进程开始执行SQL语句是因为它已获得了执行SQL语句所需的全部资源和信息。 3、提取数据(fetch):Oracle服务器进程选择所需的数据行,并在需要时将其排序,最后将结果返回给用户(进程)。 查询语句的编译处理过程: ①首先在共享池中搜索是否有相同的SQL语句(正文),如果没有就进行后续的处理。 ②检查该SQL语.

JaneWay_Chen的博客 744

RK3588多核NPU并行加速yolo优化教程:基于线程池的高性能推理实现

本教程详细介绍了RK3588多核NPU的并行加速优化方法。RK3588搭载三个独立NPU核心,总计算能力达6TOPS,但传统单线程方式无法充分发挥其性能。文章从硬件架构分析入手,详细讲解了三核心独立处理架构和多种工作模式,并通过代码示例展示了线程池技术的实现原理。线程池通过预创建工作线程、任务队列和条件变量等核心组件,避免了频繁创建线程的开销,能显著提升NPU的并行处理效率。教程还提供了性能计算公式和内存带宽优化策略,帮助开发者最大化利用RK3588的硬件算力,实现高性能AI推理。

LXY_LOVE36的博客 1024

【雷达】基于matlab合成孔径雷达干涉测量(InSAR)时序分析【含Matlab源码 9037期】

合成孔径雷达干涉测量(InSAR)时序分析 完整代码,包运行;可提供运行操作视频!适合小白!

订阅付费专栏Matlab(奶茶价版),可赠送奶茶价版付费专栏指定代码1份; 159

oracle数据库之sql的语句执行过程

sql的语句执行过程 第一步:客户端把语句发给服务器端执行 当我们在客户端执行SQL语句时,客户端会把这条SQL语句发送给服务器端,让服务器端的进程来处理这语句。也就是说,Oracle 客户端是不会做任何的操作,他的主要任务就是把客户端产生的一些SQL语句发送给服务器端。服务器进程从用户进程把信息接收到后, 在PGA 中就要此进程分配所需内存,存储相关的信息,如:在会话内存存储相关的登录信息等。 虽然在客户端也有一个数据库进程,但是,这个进程的作用跟服务器上的进程作用是不相同的,服务器上的数据库进程才会对S

m0_46400195的博客 1407

20-CUDA规约算法:并行求和优化策略-✨

本文介绍了GPU上高效并行规约(Reduction)算法的优化技巧。规约是将大量数据合并为单个值的基础计算模式,广泛应用于科学计算等领域。文章从基础并行规约实现出发,逐步讲解了三种关键优化策略:1)交错寻址减少共享内存bank冲突;2)循环展开降低分支预测开销;3)多级规约处理大规模数据。性能对比显示,优化策略可带来最高4.5倍的加速效果。最后总结了最佳实践,包括合理使用共享内存、循环展开和warp级优化等技巧。这些优化方法可显著提升GPU计算密集型应用的性能。

2301_79143213的博客 172

Oracle sql解析类型, 软解析和硬解析浅析

Oracle sql解析类型, 软解析和硬解析浅析

DBA成长之路 1096

使用R语言获取data.frame中指定列的数据

这里以"df"为例,包含三列数据:“列1”、“列2"和"列3”。通过以上代码,我们成功获取了"列1"和"列3"的数据,并将它们分别存储在了变量"column1"和"column3"中。假设我们有一个名为"df"的data.frame,其中包含了多个列,我们想要提取其中的某一列。符号,我们可以从data.frame中提取出"列2"的数据,并将其赋值给变量"column2"。符号,我们可以轻松提取出data.frame中特定列的数据,并将其存储在变量中供进一步的分析和处理使用。假设我们要获取"列2"的数据。

DevRevolt的博客 2321

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

Oracle进阶学习3:SQL语句解析类型——硬解析和软解析

文章目录硬解析和软解析shared pool功能shared pool组成SQL语句 硬解析和软解析 Oracle数据信息全部存储在数据字典中, Oracle的解析有两种,软解析以及硬解析 硬解析 hard parse 没有缓存进入硬解析 硬解析内容:语法错误,对象存不存在,用户是否有操作权限 硬解析在n种执行方案中找出最优的执行方案最消耗资源以及损耗时间 软解析 soft pars...

a1720119024的博客 3586

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

Oracle SQL 的硬解析和软解析 以及 SQL的整个在Oracle中的执行过程。

Oracle SQL 的硬解析和软解析 以及 SQL的整个在Oracle中的执行过程。 我们都知道在Oracle中每条SQL语句在执行之前都需要经过解析,这里面又分为软解析和硬解析。在Oracle中存在两种类型的SQL语句,一类为 DDL语句(数据定义语言),他们是从来不会共享使用的,也就是每次执行都需要进行硬解析。还有一类就是DML语句(数据操纵语言),他们会根据情况选择要么进

MyISDB--Focus On Database 649

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

mysql 硬解析_Oracle SQL的硬解析和软解析

说到软解析(softprase)和硬解析(hardprase),就不能不说一下Oracle对sql的处理过程。当你发出一条sql语句交付Oracle,在执行和获取结果前,Oracle对此sql将进行几个步骤的处理过程:1、语法检查(syntaxcheck)检查此sql的拼写是否语法。2、语义检查(semanticcheck)诸如检查sql语句中的访问对象是否存在及该用户是否具备相应的权限。...

weixin_39867125的博客 133
上一篇: Oracle Optimizer CBO RBO
lezerger
博客等级 码龄20年 7粉丝 2原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值