oracle软解析和硬解析

一、软解析和硬解析
一个sql查询在执行前,oracle必须对查询进行解析、限定(命名解析)、安全性检查、优化等步骤。整个过程可以统称为编译sql语句。

oracle解析的步骤如下:
1)语法解析
2)语义解析
3)生成执行计划,这里分软解析和硬解析。硬解析是非常耗资源的。
4)sql的执行

解析会占用CPU时间,而解析后的结果会存储在shared pool里面。软解析可以重用执行计划,硬解析每次都要生成执行计划。

二、绑定变量

使用绑定变量可以使sql语句的编译时间大大减少。

当一个用户与数据库建立连接后,会向数据库发出操作请求,即向数据库送过去sql语句。oracle在接收到这些sql后,会先对这个sql做一个hash函数运算,得到一个Hash值,然后到共享池中寻找是否有和这个hash值匹配的sql存在。如果找到了,oracle将直接使用已经存在的sql的执行计划去执行当前的sql,然后将结果返回给用户。如果在共享池中没有找到相同Hash值的sql,oracle会认为这是一条新的sql。会进行解析。

绑定变量是一个占位符,使用了绑定变量后,oracle就记住了这个sql语句的模版,或者是模子(缓存在shared pool中)。以后遇到相同模子的sql语句,直接取shared pool中编译后的结果,执行sql。不同语句的区别只是传进来的变量的值不一样。概念和函数调用传入参数类似。

例子:
select * from emp where empno = 123;
select * from emp where empno = 456;
以上两句执行时,oracle会认为是两条不同的sql语句。每条语句都会分别解析。

select * from emp where empno = :no;
这条sql语句,往绑定变量no中传入不同的值123、456,oracle会认为执行的是同一条sql语句,只需要编译一次,达到sql重用的效果。

绑定变量是在P/L SQL中使用。