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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- fast parse,soft parse,hard parse的區別!AST
- soft parse(軟解析),hard parse(硬解析)
- 關於軟解析(soft parse)與硬解析(hard parse),以及session cached cursors (asktom)Session
- Sql最佳化(十) 程式的可擴充套件性—sequence上的競爭SQL套件
- 可擴充套件性套件
- Sql最佳化(八):程式的可擴充套件性----direct insert的副作用SQL套件
- 關於繫結變數的SQL繫結什麼值變數SQL
- Sql最佳化(九) 程式的可擴充套件性-- 短連線的危害,以及資料庫連線(connection)管理SQL套件資料庫
- Python為什麼能擴充套件Python套件
- 【最佳化】使用繫結變數 OR 不使用繫結變數,這不是問題!變數
- dbms_sql.parseSQL
- 可擴充套件性筆記一套件筆記
- ETL的可擴充套件性和可維護性套件
- 編寫可擴充套件程式套件
- SQL Developer中使用繫結變數SQLDeveloper變數
- java程式裡怎麼使用繫結變數Java變數
- What is a Parse Tree? 什麼是解析樹
- kotlin 擴充套件(擴充套件函式和擴充套件屬性)Kotlin套件函式
- 【sql調優】使用繫結變數(二)SQL變數
- 【sql調優】使用繫結變數(一)SQL變數
- React元件方法中為什麼要繫結thisReact元件
- 什麼時候使用繫結變數效能反而更差變數
- Solon詳解(六)- Solon的校驗擴充套件框架使用與擴充套件套件框架
- Swift快速為類擴充套件屬性Swift套件
- 聊聊如何讓你的業務程式碼具有可擴充套件性套件
- 簡要剖析:可擴充套件的微服務架構套件微服務架構
- 【Kotlin】擴充套件屬性、擴充套件函式Kotlin套件函式
- SQL使用繫結變數,測試例項。SQL變數
- WCF擴充套件:行為擴充套件Behavior Extension套件
- How to Identify Hard Parse Failures (文件 ID 1353015.1)IDEAI
- 強大的CSS: 使用“變數種子計數器”擴充套件動畫更多可能性CSS變數套件動畫
- Parse CPU to Parse Elapsd %: 指標太低指標
- AWR Execute to Parse引數解析
- C#列舉(一)使用總結以及擴充套件類分享C#套件
- Sql最佳化(二十) 繫結變數用法、適用場合SQL變數
- oracle實驗記錄 (分析oracle硬解析&軟解析&fast soft parse)OracleAST
- Edge要相容 Chrome 擴充套件Chrome套件
- SQL Server動態SQL,繫結變數SQLServer變數