来自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不同?
答案 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
。