Sql最佳化(六)程式可擴充套件性:soft parse/hard parse,以及為什麼要使用繫結變數
有時單個sql執行效率還不錯,但程式一發布,併發程式多了後,系統就執行很慢,這說明程式的擴充套件性較差。程式擴充套件性(scalability)差的原因有很多,例如設計不合理導致的互鎖。除了鎖之外,硬解析也是一個重要原因。硬解析會造成伺服器cpu資源緊張,tom甚至認為不使用繫結變數往往是影響oracle效能和擴充套件性的最大問題。
[@more@]一、 soft parse和hard parse
當oracle執行一句sql時,會先在library cache中進行匹配(相同sql是否執行過?),如果匹配成功則直接使用,這稱為soft parse;
如果匹配失敗,則需要parse,name resolved,security-check,optimize等等,這稱為hard parse(硬解析),可以想像成源程式先編譯後執行。
硬解析的危害:
1) 佔用資源更多,執行慢,因為不會重用已解析好的query plan
2) 硬解析導致library cache上的latch競爭,這會降低系統的併發性,使oracle無法充分利用系統資源。(此時即使系統資源看上去不忙,oracle也會很慢)
3) 一個有很多硬解析的簡單應用可能導致資料庫所有應用變慢。
二、 為什麼必須使用繫結變數
如果不使用繫結變數而使用常量,會導致大量硬解析。以下是一個測試,對比使用繫結變數和使用常量時解析情況
SQL> select a.name name, b.value
2 from v$statname a, v$mystat b
3 where a.statistic# = b.statistic# and (a.name) in('parse count (hard)','parse count (total)')
4 order by name;
parse count (hard) 19
parse count (total) 92
SQL> declare
i number;
n number;
begin
for i in 1..10 loop
n:=i;
insert into test_table3 values(n);
end loop;
end;
/
PL/SQL procedure successfully completed.
SQL> select a.name name, b.value
from v$statname a, v$mystat b
where a.statistic# = b.statistic# and (a.name) in('parse count (hard)','parse count (total)')
order by name;
parse count (hard) 22
parse count (total) 106
SQL> declare
begin
insert into test_table3 values(1);
insert into test_table3 values(2);
insert into test_table3 values(3);
insert into test_table3 values(4);
insert into test_table3 values(5);
insert into test_table3 values(6);
insert into test_table3 values(7);
insert into test_table3 values(8);
insert into test_table3 values(9);
insert into test_table3 values(10);
end;
/
PL/SQL procedure successfully completed.
SQL> select a.name name, b.value
from v$statname a, v$mystat b
where a.statistic# = b.statistic# and (a.name) in('parse count (hard)','parse count (total)')
order by name;
parse count (hard) 33
parse count (total) 118
可以看到,在上面的例子中,使用繫結變數時,有3次硬解析(包括PLSQL塊),而使用常量時,則產生了11次硬解析。後者消耗的系統資源大大超過前者。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/25462274/viewspace-2124911/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 可擴充套件性套件
- Python為什麼能擴充套件Python套件
- 編寫可擴充套件程式套件
- kotlin 擴充套件(擴充套件函式和擴充套件屬性)Kotlin套件函式
- Solon詳解(六)- Solon的校驗擴充套件框架使用與擴充套件套件框架
- 【Kotlin】擴充套件屬性、擴充套件函式Kotlin套件函式
- React元件方法中為什麼要繫結thisReact元件
- 提高擴充套件性套件
- 簡要剖析:可擴充套件的微服務架構套件微服務架構
- C#列舉(一)使用總結以及擴充套件類分享C#套件
- 聊聊如何讓你的業務程式碼具有可擴充套件性套件
- Edge要相容 Chrome 擴充套件Chrome套件
- [20230104]Oracle too many parse errors PARSE ERROR.txtOracleError
- 強大的CSS: 使用“變數種子計數器”擴充套件動畫更多可能性CSS變數套件動畫
- 為什麼JSON.parse會損壞大數字,如何解決這個問題?JSON
- 教你 4 步搭建彈性可擴充套件的 WebAPI套件WebAPI
- python parse timePython
- parse-jsonJSON
- 【JavaScript】什麼是擴充套件運算子?JavaScript套件
- V$sql查詢未使用繫結變數的語句SQL變數
- 可擴充套件的使用者表設計套件
- Homestead 安裝 MongoDB 以及擴充套件!MongoDB套件
- 在vue2中,什麼是雙向繫結,為什麼vue3要進行最佳化?Vue
- Swift 擴充套件 Storyboard 屬性Swift套件
- 一個超級簡單的PHP超全域性變數管理擴充套件PHP變數套件
- 使用Kotlin擴充套件函式擴充套件Spring Data案例Kotlin套件函式Spring
- sql中的擴充套件學習SQL套件
- COLA的擴充套件性使用和原始碼研究套件原始碼
- 從 IM 通訊 Web SDK 來看如何提高程式碼可維護性與可擴充套件性Web套件
- tmp dbg parse tree
- JavaScript Date.parse()JavaScript
- JSON.parse() 方法JSON
- JSON.parse()方法JSON
- 可擴充套件物件導向的canvas畫圖程式套件物件Canvas
- 為什麼要將區域性變數的作用域最小化?變數
- PHP函式之parse_str()和parse_url()函式PHP函式
- 開源SDN平臺的可擴充套件性與部署要點 丨FNDC演講實錄套件
- php以及php擴充套件memcache 安裝PHP套件
- MySQL - 擴充套件性 2 擴充套件策略:氪金氪腦任君選MySql套件