谁能讲讲sql硬软解析的区别
这个要从oracle的体系结构说起,oracle的内存结构中最大的一部分是sga,在sga中有share pool和data buffer cache等,你可以简单的理解为(这么理解不是100%准确,只能简单理解)share pool缓存sql语句,data buffer cache缓存查询数据 一条sql从客户端发往服务端,首先要进行hash code,通过hash value在share pool中查找,看有没有缓存,如果有就直接用,这就是软解析。如果没有就要将他加载到share pool中,就是硬解析。 这是最简单的理解,当然在share pool中还有很多部分,各司其职。
怎么让oracle 重新硬解析
但是在sql中,我们可以用绑定变量替代掉常量而使sql不做硬解析。
楼主可以用这个语句。
Select hash_value, substr(sql_text,1,80)
from v$sqlarea
where substr(sql_text,1,40) in (select substr(sql_text,1,40)
from v$sqlarea
having count(*) > 4
group by substr(sql_text,1,40));
楼主可以用这个语句找出相似的语句在进行进一步筛选。
Oracle SQL的硬解析和软解析
我们都知道在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值我们可以通过访问vsqlarea、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的时间可能不会有多少感觉,但是当量大了以后就会有比较明显的感觉了。
从外到内提高SQL Server数据库性能
第二层 服务器配置 这里指的服务器配置 主要是讲数据库服务器的硬件配置以及周边配套 虽然说 提高数据库的硬件配置 需要企业付出一定的代价 但是 这往往是一个比较简便的方法 比起优化SQL语句来说 其要简单的多 如企业可以通过增加硬盘的数量来改善数据库的性能 在实际工作中 硬盘输入输出瓶颈经常被数据...
急!高分求做SQL Server数据库设计【达人请进】
下述十四个技巧,是许多人在大量的数据库分析与设计实践中,逐步总结出来的。对于这些经验的运用,读者不能生帮硬套,死记硬背,而要消化理解,实事求是,灵活掌握。并逐步做到:在应用中发展,在发展中应用。1. 原始单据与实体之间的关系 可以是一对一、一对多、多对多的关系。在一般情况下,它们是一...
求助:sqlserver2005如何进行内存优化
如果可用内存比执行查询所需的指定最小内存多,则只要查询能对多出的内存加以有效的利用,就可以使用多出的内存。附实例一篇:最近,为了能在数据库服务器中运行其他应用程序,在保持数据库操作系统版本不变的前提下对数据库服务器进行了软、硬件上的升级。在软件上,将操作系统从Windows 2000升级到Windows...
Ahnlab HackShield Pro打不开 谁帮我看看是什么回事?
如果挂起(灰色),你聘请一个专业的人来了,如果正常的话,在该软件的根目录(右软解的快捷方式 - 找到目标)此目录下找到的软件和数据库连接到一个文件,请参阅接入点在右边的文件服务器的地址。3>如果你不使用SQL数据库软件,我不是太清楚...比纯属个人意见,希望能帮助你!
大数据初学者应该怎么学?
Sqoop:这个是用于把Mysql里的数据导入到Hadoop里的。当然你也可以不用这个,直接把Mysql数据表导出成文件再放到HDFS上也是一样的,当然生产环境中使用要注意Mysql的压力。Hive:这个东西对于会SQL语法的来说就是神器,它能让你处理大数据变的很简单,不会再费劲的编写MapReduce程序。有的人说Pig那?它和...
面试软件测试 主要提问哪些问题
1、 说说你们公司测试的一个基本测试流程是什么?答:首先会召开需求分析会议,参加人员有产品、开发和测试,主要是探讨需求主要的一些功能点,完了之后,开发就排期进行开发,我们就根据主管写出来的计划、分配到的任务编写测试用例,写完之后会进行用例评审,有评审修改的就修改整理形成最终的用例版本,之后...
应用程序无法正常启动0xc000007b
形成原因是因为DirectX 9.0被损坏, 只需要安装即可。 如果有电脑管家的。在电脑管家里面搜索“DirectX 9.0 c” 然后点击安下载装即可。2、一键修复工具:有很多人可能安装了DirectX 9.0c还是会提示,这个可能是因为电脑未安装32位版本的DirectX文件,这些有些对电脑不懂得就会不知道怎么办,可以使用...
电脑弹出来一个应用程序错误时什么原因?ox7c939af2指令引用的0x000000...
买到水货内存、多条内存一起用不兼容等,建议更换内存即可能解决。7 电脑用久了,硬盘坏,重新分区安装系统可以修复逻辑坏道,还是不行,那就到了该换硬盘的时候了,换个硬盘就可以解决。硬件方面的问题,如果你不专业,建议拿到电脑店去测试,测试好了讲好价再换。希望能帮到你!!!
explorer.exe 应用程序错误0X00000000指令引用0X00000000内存.该内存...
你好 你说的这种情况,一般都是由 系统软件、内存、硬盘引起的。1 电脑不心装上了恶意软件,或上网时产生了恶意程序,建议用360 卫士 、金山卫士等软件,清理垃圾,查杀恶意软件,完成后重启电脑,就可能解决。实在不行,重装,还原过系统,可以解决软件引起的问题。2 如果不能进入系统,可以开机后 到...
永久性删除的视频文件可以恢复吗?
硬盘软故障:系统故障:系统不能正常启动、密码或权限丢失、分区表丢失、BOOT区丢失、MBR丢失; 文件丢失:误操作、误格式化、误克隆、误删除、误分区、病毒破坏、黑客攻击、PQ操作失败、RAID磁盘阵列失效等; 文件损坏:损坏的Office系列Word、Excel、Access、PowerPoint文件Microsoft SQL数据库复、Oracle数据库文件修复、...
金郊人参: 1、硬解析即整个SQL语句的执行需要完完全全的解析,生成执行计划. 硬解析过程: 1.语法、语义及权限检查; 2.查询转换(通过应用各种不同的转换技巧,会生成语义上等同的新的SQL语句,如count(1)会转为count(*)); 3.根据统计信息生成...
河南省17082249926: 怎样判断一个SQL语句是硬解析还是软解析 - ?
金郊人参: 只要执行的sql语句文 本相同,并且对应sql的执行计划已经缓存在oracle的内存(library cache)中,那么无论你怎么去执行这条sql,都不会硬解析,而是软解析.相反来说,如果这个sql你第一次执行,或者之前执行sql的执行计划已经 从oracle内存中置换出来,那么肯定会硬解析. 建议看一下oracle内存方面的资料,会有相对应的解释.
河南省17082249926: Oracle硬解析和软解析的区别分析 - ?
金郊人参: 这个要从oracle的体系结构说起,oracle的内存结构中最大的一部分是sga,在sga中有share pool和data buffer cache等,你可以简单的理解为(这么理解不是100%准确,只能简单理解)share pool缓存sql语句,data buffer cache缓存查询数据 一条sql从客户端发往服务端,首先要进行hash code,通过hash value在share pool中查找,看有没有缓存,如果有就直接用,这就是软解析.如果没有就要将他加载到share pool中,就是硬解析. 这是最简单的理解,当然在share pool中还有很多部分,各司其职.
河南省17082249926: 什么是sql绑定变量 - ?
金郊人参: 提到绑定变量,首先肯定想到硬解析和软解析.绑定变量是解决硬解析的利器.科普:硬解析:就是一条没有执行过的sql.数据库首先对他进行语法分析和解析,过后,根据分析的信息生成最好的执行计划,然后执行.软解析:就是已经存在了...
河南省17082249926: 同样一个存储过程,为什么第一次快,第二次就很慢 - ?
金郊人参: sql是高级语言,数据库系统执行sql之前要将sql语句进行解析(相当于编译),这个过程叫硬解析;数据库系统每次执行sql之前都会检查共享池中是不是存在已经解析过的语句,如果有就拿来直接用,这叫软结息.软解析比硬解析效率高,这是影响因素之一;二、第一次执行可能没有走索引,第二次执行使用第一次执行的执行计划 三、看你的存储过程做了些什么,有可能第一次把活干完了,导致第二次执行没什么活干 以上回答基于oracle体系结构
河南省17082249926: 在Oracle中SQL语句的解析步骤是怎样的呢? ?
金郊人参: 在Oracle中SQL语句的解析步骤如下: 1、 语法检测.判断一条SQL语句的语法是否符合SQL的规范,比如执行:SQL> selet * from emp;我们就可以看出由于Select关键...
河南省17082249926: 请问软解好还是硬解好??
金郊人参: 单说效果,我觉得硬解、软解没有差别.要说差别,就是硬解对片子的编码格式有很多限制,有些片子很难完美硬解,而软解的兼容性明显好.硬解最大的好处就是降低CPU占用,省电,低噪音(风扇转速低的原因).
河南省17082249926: oracle 如何使用绑定变量 - ?
金郊人参: 绑定变量介绍2009/08/09 BY MACLEAN LIU 5 COMMENTS Oracle在执行SQL语句时,普遍存在以下几个步骤:当SQL语句首次执行,Oracle将确认该句语句的语法是否正确(语法解析Syntax parse)并进一步确认语句相关表和列的存在性等因...
河南省17082249926: 如何查看一个SQL语句硬解析次数 - ?
金郊人参: 硬解析? 不是很明白这个意思.是不是指没有使用缓存计划?如果的话,如果使用参数是第一次解析,以后就可以使用缓存计划了.你一个循环的话,在里面在SQL拼字符(把变量放进去),那都是硬解析,不会利用计划 的.
河南省17082249926: oracle 中一次解析多次执行指的是软解析操作吗? - ?
金郊人参: sql执行重复率高的时候看这个比较有用.像OLTP系统, 可以看软解析的比例,, 如果想提高这个比例的话, 有三方面: 1 增加SGA内存. 2 编写sql的时候, 规范化, 因为重用sql的时候, 必须完全一样, 3 使用绑定变量.