2014-10-09 47 views
0

this解釋在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步不同?

回答

0

甲骨文有三個「虛擬機」,一個SQL,PL/SQL和一個JVM。在你的情況下,兩個虛擬機必須進行交互。

調查v $ sql_plan,看看究竟是從PL/SQL傳遞給SQL解析器的。 PL/SQL變量將被替換爲bind var。佔位符。

您還可以跟蹤會話。在跟蹤文件中,您將看到一個PARSE和兩個CURSOR執行。所以很可能只有一個硬解析和沒有軟解析。 您可以多次使用不同綁定變量重新執行分析語句。

PS:從PL/SQL執行SQL時,應該使用SELECT INTO

+0

'PS:從PL/SQL執行SQL時應使用SELECT INTO:是的,我的查詢只是爲了舉例。 所以你的意思是說在這種情況下甚至不會有軟解析? – Arnab 2014-10-09 10:58:32

+0

@Arnab - 是的。在跟蹤文件中,您將看到:PARSE CURSOR#1,EXECUTE CURSOR#1(綁定變量值6675),EXECUTE CURSOR#1(綁定變量值12345)。當您從另一個會話執行同一個塊時,將發生軟解析。 – ibre5041 2014-10-09 11:12:03

3

沒有,在這兩種情況下,查詢使用綁定變量:

SELECT EMP_NAME FROM EMPLOYEES WHERE EMPLOYEE_NO = :B1 

因此,甲骨文可以使用相同的解析的查詢兩種,只是結合了不同的值。

如果能夠從系統視圖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