1,Sql parse的種類
Sql parse又通常分為硬解析和軟解析,當sql第一次執行的時候,會發生硬解析,之後的執行如果在shared pool中能找到就是軟解析。因此,為提高數據性能,盡可能的讓每次執行的SQL在shared pool找到。
2,SQL在哪些情況下會發送硬解析?
1)統計信息改變
2)Sql中的表上有做ddl操作,包括grant和revoke。
3)執行計劃被踢出shared pool
4)開啟了trace
5)綁定變量長度變化
6)啟用outline,11g啟用SPM
7)SQL語句相同但是所引用的表不同,例如不是同一屬主
8)環境發生變化,如Sort area size、Hash area size和locale setting發生變化
3,軟解析的條件
當你向ORACLE 提交一個SQL語句,ORACLE會首先在共享內存中查找是否有相同的語句。這裡需要注明的是,ORACLE對兩者采取的是一種嚴格匹配,要達成共享,SQL語句必須完全相同(包括空格,換行等)。如果完全相同,才會有軟解析。
4,如何判斷兩個sql語句是否是同一個sql語句呢?
1)大小寫和空格以及字母值不一致:
SELECT * FROM emp WHERE empno = 1000;
和下列每一個都不同
SELECT * from emp WHERE empno = 1000;
SELECT * FROM emp WHERE empno = 1000;
SELECT * FROM emp WHERE empno = 2000;
在上面的語句中列值都是直接SQL語句中的,我們將這類sql稱為硬編碼SQL或字面值SQL
2)綁定變量名稱不同
使用綁定變量的SQL語句中必須使用相同的名字的綁定變量(bind variables)
例如:
a. 該2個sql語句被認為相同
select * from emp where empno = :empno;
select * from emp where empno = :empno;
b. 該2個sql語句被認為不相同
select * from emp where empno = :empno1;
select * from emp where empno = :empno2;
我們將上面的這類語句稱為綁定變量SQL。
3)對象名稱相同,但是屬主不同
將所發出語句中涉及的對象與已存在語句所涉及對象相比較。
例如:
如用戶user1與用戶user2下都有EMP表,則
用戶user1發出的語句:SELECT * FROM EMP; 與
用戶user2發出的語句:SELECT * FROM EMP; 被認為是不相同的語句,
因為兩個語句中引用的EMP不是指同一個表。
4) 在SQL語句中使用的捆綁變量的捆綁類型必須一致