天天看點

oracle資料庫性能影響之Sql parse

1,sql parse的種類

sql parse又通常分為硬解析和軟解析,當sql第一次執行的時候,會發生硬解析,之後的執行如果在shared pool中能找到就是軟解析。是以,為提高資料性能,盡可能的讓每次執行的sql在shared pool找到。

2,sql在哪些情況下會發送硬解析?

)統計資訊改變

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 = 2000;

在上面的語句中列值都是直接sql語句中的,我們将這類sql稱為寫死sql或字面值sql

2)綁定變量名稱不同

使用綁定變量的sql語句中必須使用相同的名字的綁定變量(bind variables)

例如:

a. 該2個sql語句被認為相同

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語句中使用的捆綁變量的捆綁類型必須一緻

上一篇: Python入門
下一篇: java序列化