知识大全 Sql语句解析过程

Posted 语句

篇首语:五陵年少金市东,银鞍白马渡春风。本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 Sql语句解析过程相关的知识,希望对你有一定的参考价值。

Sql语句解析过程  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!

  为了将用户写的SQL文本转化为Oracle认识的且可执行的语句 这个过程就叫做解析过程 解析分为硬解析和软解析 一条SQL语句在第一次被执行时必须进行硬解析

  当客户端发出一条SQL语句(也可以是一个存储过程或者一个匿名PL/SQL块)进入shared pool时(注意 我们从前面已经知道 Oracle对这些SQL不叫做SQL语句 而是称为游标 因为Oracle在处理SQL时 需要很多相关的辅助信息 这些辅助信息与SQL语句一起组成了游标) Oracle首先将SQL文本转化为ASCII值 然后根据hash函数计算其对应的hash值(hash_value) 根据计算出的hash值到library cache中找到对应的bucket 然后比较bucket里是否存在该SQL语句

  如果不存在 则需要按照我们前面所描述的 获得shared pool latch 然后在shared pool中的可用chunk链表(也就是bucket)上找到一个可用的chunk 之后释放shared pool latch 在获得了chunk以后 这块chunk就可以认为是进入了library cache 接下来 进行硬解析过程 硬解析包括以下几个步骤

  对SQL语句进行文法检查 看是否有文法错误 比如没有写from select拼写错误等 如果存在文法错误 则退出解析过程

  到数据字典里校验SQL语句涉及的对象和列是否都存在 如果不存在 则退出解析过程 这个过程会加载dictionary cache

  将对象进行名称转换 比如将同名词翻译成实际的对象等 比如select * from t中 t是一个同名词 指向hr t 于是Oracle将t转换为hr t 如果转换失败 则退出解析过程

  检查发出SQL语句的用户是否具有访问SQL语句里所引用的对象的权限 如果没有权限 则退出解析过程

  通过优化器创建一个最优的执行计划 这个过程会根据数据字典里记录的对象的统计信息 来计算最优的执行计划 这一步牵涉大量数学运算 是最消耗CPU资源的

  将该游标所产生的执行计划 SQL文本等装载进library cache的heap中

  在硬解析的过程中 进程会一直持有library cache latch 直到硬解析结束为止 硬解析结束以后 会为SQL语句产生两个游标 一个是父游标 另一个是子游标 父游标里主要包含两种信息 SQL文本以及优化目标(optimizer goal) 父游标在第一次打开时被锁定 直到其他所有的session都关闭该游标后才被解锁 当父游标被锁定的时候是不能被交换出library cache的 只有在解锁以后才能被交换出library cache 父游标被交换出内存时 父游标对应的所有子游标也被交换出library cache 子游标包括游标所有的信息 比如具体的执行计划 绑定变量等 子游标随时可以被交换出library cache 当子游标被交换出library cache时 Oracle可以利用父游标的信息重新构建出一个子游标来 这个过程叫reload 可以使用下面的方式来确定reload的比率

  select *sum(reloads)/sum(pins) Reload_Ratio from v$librarycache;

  一个父游标可以对应多个子游标 子游标具体的个数可以从视图v$sqlarea的version_count字段体现出来 而每个具体的子游标则全都在视图v$sql里体现 当具体绑定变量的值与上次绑定变量的值有较大差异(比如上次执行的绑定变量值的长度是 位 而这次执行绑定变量的值的长度是 位)时或者当SQL语句完全相同 但是所引用的表属于不同的用户时 都会创建一个新的子游标

  如果在bucket中找到了该SQL语句 则说明该SQL语句以前运行过 于是进行软解析 软解析是相对于硬解析而言的 如果解析过程中 可以从硬解析的步骤中去掉一个或多个的话 这样的解析就是软解析 软解析分为以下三种类型

  第一种是某个session发出的SQL语句与library? cache里其他session发出的SQL语句一致 这时 该解析过程中可以去掉硬解析中的 和 但是仍然要进行硬解析过程中的 也就是表名和列名检查 名称转换和权限检查

  * 第二种是某个session发出的SQL语句是该session之前发出的曾经执行过的SQL语句 这时 该解析过程中可以去掉硬解析中的 和 这四步 但是仍然要进行权限检查 因为可能通过grant改变了该session用户的权限

  * 第三种是当设置了初始化参数session_cached_cursors时 当某个session第三次执行相同的SQL时 则会把该SQL语句的游标信息转移到该session的PGA里 这样 该session以后再执行相同的SQL语句时 会直接从PGA里取出执行计划 从而跳过硬解析的所有步骤 这种情况下 是最高效的解析方式 但是会消耗很大的内存

  我们举一个例子来说明解析SQL语句的过程 在该测试中 绑定变量名称相同 但是变量类型不同时 所出现的解析情况 如下所示

  首先 执行下面的命令 清空shared pool里所有的SQL语句

  SQL> alter system flush shared_pool;

  然后 定义一个数值型绑定变量 并为该绑定变数赋一个数值型的值以后 执行具体的查询语句

  SQL> variable v_obj_id number;

  SQL> exec :v_obj_id := ;

  SQL> select object_id object_name from sharedpool_test

  where object_id=:v_obj_id;

  OBJECT_ID       OBJECT_NAME

       

              AGGXMLIMP

  接下来 定义一个字符型的绑定变量 变量名与前面相同 为该绑定变数赋一个字符型的值以后 执行相同的查询

  SQL> variable v_obj_id varchar ( );

  SQL> exec :v_obj_id := ;

  SQL> select object_id object_name from sharedpool_test

  where object_id=:v_obj_id;

  OBJECT_ID       OBJECT_NAME

       

              AGGXMLIMP

  然后我们到视图v$sqlarea里找到该SQL的父游标的信息 并到视图v$sql里找该SQL的所有子游标的信息

  SQL> select sql_text version_count from v$sqlarea where

  sql_text like %sharedpool_test% ;

  SQL_TEXT

  VERSION_COUNT

  

  

  select object_id object_name from sharedpool_test where

  object_id=:v_obj_id         

  SQL> select sql_text child_address address from v$sql

  where sql_text like %sharedpool_test% ;

  SQL_TEXT

  CHILD_ADDRESS  ADDRESS

  

  

  select object_id object_name from sharedpool_test where

  object_id=:v_obj_id    F

   B D

  select object_id object_name from sharedpool_test where

  object_id=:v_obj_id    FC

   B D

  从记录父游标的视图v$sqlarea的version_count列可以看到 该SQL语句有 个子游标 而从记录子游标的视图v$sql里可以看到 该SQL文本确实有两条记录 而且它们的SQL文本所处的地址(ADDRESS列)也是一样的 但是子地址(CHILD_ADDRESS)却不一样 这里的子地址实际就是子游标所对应的heap 的句柄

cha138/Article/program/Oracle/201311/18653

相关参考

知识大全 解析关于SQL语句Count的一点细节

解析关于SQL语句Count的一点细节  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!复制代码代码如

知识大全 存储过程里动态生成包含SQL语句字符串

存储过程里动态生成包含SQL语句字符串  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  某些时候我

知识大全 SQL基本语句

SQL基本语句  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  掌握SQL四条最基本的数据*作语句

知识大全 测试sql语句性能

  有时候我们经常为我们的sql语句执行效率低下发愁反复优化后可还是得不到提高  那么你就用这条语句找出你sql到底是在哪里慢了  示例  SETSTATISTICSioON  &

知识大全 SQL语句获取日期

SQL语句获取日期  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  SQL语句获取特定日期  一个

知识大全 sql语句实现表的字段名查询

  下面为您介绍的是查询表的字段名的sql语句写法sql语句可以实现许多的功能希望可以您在学习sql语句使用方面获得启示  selectnamefromsyscolumnswhereid=(selec

知识大全 Sql语言基础教程 sql基本语句[1]

Sql语言基础教程sql基本语句[1]  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! &

知识大全 Sql语言基础教程 sql基本语句[2]

Sql语言基础教程sql基本语句[2]  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! &

知识大全 ACCESS中使用SQL语句

ACCESS中使用SQL语句  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  以下SQL语句在AC

知识大全 SQL语句语法大全

SQL语句语法大全  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  小编整理的一些比较常用的SQL