oracle实验--让sql解析过程简单易懂
概述
由于最近需要做一些sql query性能提升的研究,因此研究了一下sql语句的解决过程。
下面介绍一下sql的解析过程和简单一个实验来看下硬解析和软解析之间的判断。
sql 的解析过程
1)运用HASH算法,得到一个HASH值,这个值可以通过V$SQLAREA.HASH_VALUE 查看
2)到shared pool 中的 library cache 中查找是否有相同的HASH值,如果存在,则无需硬解析,进行软解析
3)如果shared pool不存在此HASH值,则进行语法检查,查看是否有语法错误
4)如果没有语法错误,就进行语义检查,检查该SQL引用的对象是否存在,该用户是否具有访问该对象的权限
5)如果没有语义错误,对该SQL进行解析,生成解析树,执行计划
6)生成ORACLE能运行的二进制代码,运行该代码并且返回结果给用户
硬解析和软解析都在第5步进行
硬解析通常是昂贵的操作,大约占整个SQL解析过程的70%左右的时间,硬解析会生成执行树,执行计划,等等。
当再次执行同一条SQL语句的时候,由于发现library cache中有相同的HASH值,这个时候不会硬解析,而会软解析, 其实软解析就是跳过了生成解析树,生成执行计划这个耗时又耗CPU的操作,直接利用生成的执行计划运行该SQL语句。
执行以下4个sql,观察生成硬解析与执行计划的情况
conn scott/tiger; Sql1:select * from emp where empno=7788; Sql2:select * from Emp where empno=7788; Sql3:select * from emp where empno=7788; Sql4:select * from emp where empno=7788;
--查看sql执行情况 select v.sql_text, v.sql_id, v.hash_value, v.EXECUTIONS, v.PARSE_CALLS, v.PLAN_HASH_VALUE, v.OPTIMIZER_MODE from v$sqlarea v where v.PARSING_SCHEMA_NAME = 'SCOTT' ORDER BY V.FIRST_LOAD_TIME desc
执行结果如下,可以看到4句sql由于1与4完全相同,则发生了一次硬解析一次软解析,执行次数为2并且使用了同一个执行计划。2与3由于一点细微的改变则各自硬解析了一次并且各自重新生成了一个执行计划,即便执行计划是相同的。
到这里大家就知道为什么开发代码中一定要使用绑定变量的原因了。
总结:
Oracle在解析和执行sql时候,首先会到PGA中查找是否有匹配的session cursor,如果在当前PGA没有找到,则会到库缓存 查找是否有匹配的父子游标,如果找不到,就是生成一个新的session cursor和一对父子游标,如果找到父游标,没有找到子游标,就会生成,session cursor和子游标,挂在父游标下,这两种情况都是硬解析。
为什么要理解sql执行过程呢?只有理解sql执行过程我们才能进一步想一下怎么去优化sql,后面一段时间侧重分享这一块内容,感兴趣的朋友可以关注一下。