Oracle - 软解析和硬解析之间的区别

时间:2014-10-09 10:34:17

标签: oracle plsql

来自askTom中的this解释,硬解析和软解析之间的区别是,

  

加载到共享池中 - 将SQL源代码加载到RAM中   解析。 (“硬”解析步骤)

此步骤不在软解析中完成。

现在,假设我们执行以下块:

DECLARE
v_emp_no number;
BEGIN
 v_emp_no := 6675;
 SELECT EMP_NAME FROM EMPLOYEES WHERE EMPLOYEE_NO = v_emp_no;  --STEP 1

  v_emp_no := 1234;
 SELECT EMP_NAME FROM EMPLOYEES WHERE EMPLOYEE_NO = v_emp_no;   --STEP 2

END;

两个语句(步骤1和步骤2)完全相同,并且使用绑定变量(主机变量和绑定变量在PLSQL中几乎相同) 所以这里应该有一个软解析。

BUT

这里的查询的sql源代码在本质上不一样,基本上是

STEP 1 = SELECT EMP_NAME FROM EMPLOYEES WHERE EMPLOYEE_NO = 6675; 
STEP 2 = SELECT EMP_NAME FROM EMPLOYEES WHERE EMPLOYEE_NO = 1234; 

那么oracle如何在STEP 2中进行软解析,因为查询和源代码本质上应该与STEP 1不同?

2 个答案:

答案 0 :(得分:3)

不,两种情况下的查询都使用绑定变量:

SELECT EMP_NAME FROM EMPLOYEES WHERE EMPLOYEE_NO = :B1

因此,Oracle可以对两者使用相同的解析查询,只需绑定不同的值。

如果您可以从系统视图中选择V$SQL,那么您可以自己查看:

SQL> select sql_text from v$sql where sql_text like 'SELECT EMP_NAME%';

SQL_TEXT
--------------------------------------------------------------------------------
SELECT EMP_NAME FROM EMPLOYEES WHERE EMPLOYEE_NO = :B1

答案 1 :(得分:0)

Oracle有三个“虚拟机”,SQL一个,PL / SQL一个和JVM。在您的情况下,两个VM必须进行交互。

查看v $ sql_plan以查看从PL / SQL传递给SQL解析器的确切内容。 PL / SQL变量将替换为bind var。占位符。

您还可以跟踪会话。在跟踪文件中,您将看到一个PARSE和两个CURSOR执行。所以最有可能只有一个硬解析而不是软解析。 您可以多次使用不同的绑定变量重新执行已解析的语句。

PS:从PL / SQL执行SQL时应该使用SELECT INTO