Oracle SQL语句解析过程你造么?

我们都知道,Oracle在执行SQL之前,需要对SQL语句进行解析。Oracle中,SQL语句可分为DDL和DML两类。对于DDL,因为很少被共享使用,故几乎每次执行时,都需要进行硬解析。而对于DML,会根据实际情况进行硬解析或软解析。这些过程都是如何进行的,什么是硬解析,什么又是软解析呢?我们将在下文揭晓。

SQL语句的解析过程,从总体上,可分为四个阶段:

  • 语法检查
  • 语意检查
  • 解析阶段
  • 执行阶段

针对每个阶段,我们可以做个详细的划分:

1语法检查

对SQL语句进行语法检查,检查是否有语法错误,比如from有没有写错,如果写错,则退出解析过程。

2 语意检查

这里主要是检查对象和权限,可分为以下三步:

1、 到数据字典里校验SQL语句中涉及的对象和列是否都存在,如果不存在,则退出解析过程。

2、 将对象进行名称转换。比如将同义词转换成实际的对象,如果转换失败,则退出解析过程。

3、 检查用户是否具有访问转换后的对象的权限。如果没有权限,则退出解析过程。

3 解析阶段 

这一阶段主要是对SQL执行的环境进行判断,如绑定变量是否一样,语言环境是否一样等。可分为以下五步:

1、 对SQL文本进行HASH运算,并定位对象的句柄

这里是区分大小写、空格、注释等,定位到相同的HASH桶和HASH桶内的LIBRARY CACHE 对象句柄。

2、 检查对象的相关性

主要检查SQL对象与LIBRARY CACHE的同名对象是不是属于相同的OWNER。

3、 检查绑定变量是否一样

主要检查以下内容:

  • 绑定名是否一样,如应用代码生成的绑定1、:SYS_B_0,与SQLPLUS生成的绑定变量:b1是不一样的。
  • 绑定数据类型和绑定变量长度是否一样,如绑定的数据类型(char、number)不一致,字符串绑定变量的长度是否一样,如绑定值1和33可能是不同的子游标。

4、 检查语言环境、排序环境是否一样

例如,在会话级重新设置过语言环境,那么SQL是不能共享的。

5、 创建执行计划

根据RBO或CBO,生成一个最优的执行计划,这也是最消耗CPU的一步。

4执行阶段 

通过前三个阶段一系列的检查通过后,SQL语句将进入执行阶段,这里可分为三步:

1、 将该游标所产生的执行计划、SQL文本等装载进library cache的若干个heap中。

2、 通过私有CURSOR来执行SQL。

3、 如果是SELECT,则需要UGA来FETCH数据。

以上就是SQL解析的全过程,当前三个阶段全部要执行的时候,就是硬解析,发生在SQL第一次执行的时候。前三个阶段,省略了其中的一步,就是软解析,发生在SQL第二次执行的时候。当SQL第三次执行的时候,会把SQL的共享CURSOR复制到私有CURSOR中,由session_cached_cursors决定UGA中私有游标的数量。当SQL第四次执行的时候,会直接访问私有CURSOR,直接从第四阶段的第二步开始执行,这就是所谓的软解析。

下面再提供一个语句,以查询SQL不能被共享的原因:

在这些原因中,简单列出常见的原因:

  • SQL_TYPE_MISMATCH:类型不匹配
  • AUTH_CHECK_MISMATCH:语句授权不匹配
  • LANGUAGE_MISMATCH:语言环境不匹配
  • USER_BIND_PEEK_MISMATCH:在cursor_sharing= SIMILAR模式下 where id > 1 和 where id > 2会生成2个cursor
  • UNBOUND_CURSOR:没有绑定

SQL的解析是比较消耗CPU的。了解它的全过程,可以让数据库管理员在分析问题的时候有比较清淅的思路,对分析SQL问题、shared_pool问题都有非常大的帮助。

作者介绍:温伟灵

  • 新炬网络高级技术专家。六年的IT运维经验。
  • 具有30TB级的OLTP数据库运维经验,擅长故障诊断、处理。
  • 精通ORACLE数据库的内存结构、RAC、DataGuard等,在备份恢复、GoldenGate方面有深入的钻研。
  • 目前负责十多个客户的数据库运维工作,具有交通、金融、政府、移动、医疗等行业的运维经验。


时间: 2024-09-21 12:56:14

Oracle SQL语句解析过程你造么?的相关文章

Oracle SQL语句处理过程

oracle|过程|语句 07年开始,换了一家公司,数据库使用的是ORACLE10G,以前一直使用的是INFORMIX和MSSERVER,感觉ORACLE功能还真强大,比Informi和msserver都好用多啦,体系结构和管理方式都有了许多变化,但使用两个月下来,其实数据库的基本原理是一样的,现结合以前的工作经验和学习的资料,总结ORACLE数据库的一些知识,今天先写Oracle SQL语句处理过程:            一般来说,数据库处理SQL都会经过三个过程:分析.执行.返回结果,比如

Oracle中解析SQL语句的过程

为了将用户写的SQL文本转化为Oracle认识的且可执行的语句,这个过程就叫做解析过程.解析分为硬解析和软解析.一条SQL语句在第一次被执行时必须进行硬解析. 当客户端发出一条SQL语句(也可以是一个存储过程或者一个匿名PL/SQL块)进入shared pool时(注意,我们从前面已经知道,Oracle对这些SQL不叫做SQL语句,而是称为游标.因为Oracle在处理SQL时,需要很多相关的辅助信息,这些辅助信息与SQL语句一起组成了游标), Oracle首先将SQL文本转化为ASCII值,然后

Oracle中SQL语句解析的步骤

我们都知道在Oracle中每条SQL语句在执行之前都需要经过解析,这里面又分为软解析和硬解析.那么这两种解析有何不同之处呢?它们又分别是如何进行解析呢?Oracle内部解析的步骤又是如何进行的呢?下面我们就这些话题进行共同探讨. 在Oracle中存在两种类型的SQL语句,一类为DDL语句,他们是从来不会共享使用的,也就是每次执行都需要进行硬解析.还有一类就是DML语句,他们会根据情况选择要么进行硬解析,要么进行软解析.在Oracle 8i OCP教材的023中1-12有说明SQL语句的解析步骤,

《Oracle SQL疑难解析》——.13 在语句中找到和消除空值

1.13 在语句中找到和消除空值 Oracle SQL疑难解析 1.13.1 要解决的问题 我们需要统计出公司中,有多少员工的薪酬里含销售提成(commission percentage),有多少员工的薪酬是固定工资.我们可以用HR.EMPLOYEES表中的COMMISSION_PCT字段来获得数据. 1.13.2 解决方法 HR.EMPLOYEES表的结构允许COMMISSION_PCT字段为空值.有两个查询语句可以分别查找commission percent为空值的人和为非空值的人.首先,查

《Oracle SQL疑难解析》——1.8 在一个语句中修改多个字段值

1.8 在一个语句中修改多个字段值 Oracle SQL疑难解析 1.8.1 要解决的问题 需要在一个表中修改一行或多行的多个字段值. 1.8.2 解决方法 UPDATE语句可以让我们轻松地修改一行或多行的数据,我们也可以在UPDATE语句中用多个"column=value"子句来修改多个字段的值.例如,我们可以用下面的单个UPDATE语句来修改James Marlow(其EMPLOYEE_ID为131)的电话号码.工作角色和薪水: update hr.employees set jo

sql语句解析-关于插入数据到数据库等操作时的加密问题,请高人帮忙!

问题描述 关于插入数据到数据库等操作时的加密问题,请高人帮忙! 我想在数据库数据插入等操作中进行一些加密操作,对一些需要加密的字段加密后进行替换,请问要怎么进行sql语句解析并替换.如:"insert into table b 123"变成"insert into table HFHHJ 877878",我不是问加密算法,是怎么解析sql语句替换要加密的字段,然后再执行sql语句.另外我想用Java实现. 解决方案 oracle 有自带的函数encrypt加密 de

SQL语句执行过程详解

SQL语句执行过程详解一条sql,plsql的执行到底是怎样执行的呢?一.SQL语句执行原理:第一步:客户端把语句发给服务器端执行当我们在客户端执行 select 语句时,客户端会把这条 SQL 语句发送给服务器端,让服务器端的进程来处理这语句.也就是说,Oracle 客户端是不会做任何的操作,他的主要任务就是把客户端产生的一些 SQL 语句发送给服务器端.虽然在客户端也有一个数据库进程,但是,这个进程的作用跟服务器上的进程作用事不相同的.服务器上的数据库进程才会对SQL 语句进行相关的处理.不

oracle-java做sql语句解析遇到问题,大神麻烦戳进来

问题描述 java做sql语句解析遇到问题,大神麻烦戳进来 目前为止,把Oracle中的指定数据库的指定存储过程包download到本地创建sql文件,考虑如何把指定的表中的指定字段的加工逻辑提取出来,考虑要分增删改查不同的语句进行解析,求大神指点迷津,有代码就更好了,谢谢!!! 解决方案 http://www.cnblogs.com/zcftech/archive/2013/06/10/3131286.html 解决方案二: select name,text from user_source

oracle sql语句疑问,关于嵌套查询语句的执行先后顺序

问题描述 oracle sql语句疑问,关于嵌套查询语句的执行先后顺序 1.select A.END from 2. tableA A,tableB B 3.where A.X=B.Y 4.and A.END = ( 5. select MAX(END) from tableA 6. where tableA.X = B.Y 7. ): 我想问一下.按理max只有一个最值,为何这样写会出来多个.另外第5,6,7行是子查询,不是很理解为什么可以里面调用父查询里面的B.能详细说一下这个sql 完整的