Oracle-SQL的硬解析和软解析.docVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
Oracle-SQL的硬解析和软解析

Oracle-SQL的硬解析和软解析 Oracle SQL的硬解析和软解析Oracle SQL的硬解析和软解析 我们都知道在Oracle中每条SQL语句在执行之前都需要经过解析,这里面又分为软解析和硬解析。在Oracle中存在两种类型的SQL语句,一类为DDL语句(数据定义语言),他们是从来不会共享使用的,也就是每次执行都需要进行硬解析。还有一类就是DML语句(数据操纵语言),他们会根据情况选择要么进行硬解析,要么进行软解析。 DML:INSERT,UPDATE,DELETE,SELECT DDL:CREATE,DROP,ALTER 一.SQL解析过程 Oracle对此SQL将进行几个步骤的处理过程: 1、语法检查(syntaxcheck):检查此sql的拼写是否语法。 2、语义检查(semanticcheck):诸如检查sql语句中的访问对象是否存在及该用户是否具备相应的权限。 3、对sql语句进行解析(prase):利用内部算法对sql进行解析,生成解析树(parsetree)及执行计划(executionplan)。 4、执行sql,返回结果(executeandreturn) 二.解析过程详解 2.1语法检测 判断一条SQL语句的语法是否符合SQL的规范,比如执行: SQLgt;selet*fromemp; 我们就可以看出由于Select关键字少了一个ldquo;crdquo;,这条语句就无法通过语法检验的步骤了。 2.2语义检查 语法正确的SQL语句在解析的第二个步骤就是判断该SQL语句所访问的表及列是否准确?用户是否有权限访问或更改相应的表或列?比如如下语句: SQLgt;select*fromemp; select*fromemp * ERRORatline1: ORA-00942:tableorviewdoesnotexist 由于查询用户没有可供访问的emp对象,因此该SQL语句无法通过语义检查。 2.3解析(Parse) 2.3.1Parse主要分为三种: 1、HardParse(硬解析) 2、SoftParse(软解析) 3、SoftSoftParse(好像有些资料中并没有将这个算在其中) HardParse:就是上面提到的对提交的Sql完全重新从头进行解析(当在SharedPool中找不到时候将会进行此操作),总共有一下5个执行步骤: 1:语法分析 2:权限与对象检查 3:在共享池中检查是否有完全相同的之前完全解析好的.如果存在,直接跳过4和5,运行Sql,此时算softparse. 4:选择执行计划 5:产生执行计划 注:创建解析树、生成执行计划对于sql的执行来说是开销昂贵的动作,所以,应当极力避免硬解析,尽量使用软解析。这就是在很多项目中,倡导开发设计人员对功能相同的代码要努力保持代码的一致性,以及要在程序中多使用绑定变量的原因。 SoftParse:就如果是在SharedPool中找到了与之完全相同的Sql解析好的结果后会跳过HardParse中的后面的两个步骤。 SoftSoftParse:实际上是当设置了session_cursor_cache这个参数之后,Cursor被直接Cache在当前Session的PGA中的,在解析的时候只需要对其语法分析、权限对象分析之后就可以转到PGA中查找了,如果发现完全相同的Cursor,就可以直接去取结果了,也就就是实现了SoftSoftParse. 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*fromemp;用户SYSTEM也有一张EMP表,同样要查询select*fromemp;这样他们两条语句在文本上是一模一样的,他们的HASH值也会一样,但是由于涉及到查询的相关表不一样,他们事实上是无法共享的. SQLgt;conn/assysdba 已连接。 SQLgt;showuser USER为SYS SQLgt;createtableemp(xin

文档评论(0)

htfyzc + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档