从这在askTom中的解释来看,硬解析和软解析的区别在于,
加载到共享池- 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中主机变量和绑定变量实际上是相同的),所以这里应该有一个软解析。
但
查询的sql源代码在这里不能相同,基本上是一样的。
STEP 1 = SELECT EMP_NAME FROM EMPLOYEES WHERE EMPLOYEE_NO = 6675;
STEP 2 = SELECT EMP_NAME FROM EMPLOYEES WHERE EMPLOYEE_NO = 1234; 那么,oracle如何在第2步进行软解析,因为查询和源代码应该与步骤1不同?
发布于 2014-10-09 10:45:36
Oracle有三个“虚拟机”:SQL、PL/SQL和JVM。在您的示例中,两个VM必须进行交互。
查看v$sql_plan,查看从PL/SQL确切传递给SQL解析器的内容。PL/SQL变量将被bind替换。占位符。
您还可以跟踪会话。在跟踪文件中,您将看到游标的一个解析和两个执行。所以很可能只有一个硬解析而没有软解析。您可以多次使用不同的绑定变量重新执行已解析语句.
PS:当从PL/SQL执行SQL时,您应该使用SELECT INTO。
发布于 2014-10-09 10:43:27
不,这两种情况下的查询都使用了一个绑定变量:
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 = :B1https://stackoverflow.com/questions/26276216
复制相似问题