SQL解析之硬解析和软解析
當客戶端進程,將SQL語句通過監聽器發送到Oracle時, 會觸發一個Server process生成,來對該客戶進程服務。Server process得到SQL語句之后,對SQL語句進行Hash運算,然后根據Hash值到library cache中查找,如果存在,則直接將library cache中的緩存的執行計劃拿來執行,最后將執行結果返回該客戶端,這種SQL解析叫做軟解析;如果不存在,則會對該SQL進行解析parse,然后執行,返回結果,這種SQL解析叫做硬解析。
1.硬解析的步驟
硬解析一般包括下面幾個過程:
1)對SQL語句進行語法檢查,看是否有語法錯誤。比如select from where 等的拼寫錯誤,如果存在語法錯誤,則推出解析過程;
2)通過數據字典(row cache),檢查SQL語句中涉及的對象和列是否存在。如果不存在,則推出解析過程。
3)檢查SQL語句的用戶是否對涉及到的對象是否有權限。如果沒有則推出解析;
4)通過優化器創建一個最優的執行計劃。這個過程會根據數據字典中的對象的統計信息,來計算多個執行計劃的cost,從而得到一個最優的執行計劃。這一步涉及到大量的數據運算,從而會消耗大量的CPU資源;(library cache最主要的目的就是通過軟解析來減少這個步驟);
5)將該游標所產生的執行計劃,SQL文本等裝載進library cache中的heap中。
2.軟解析
所謂軟解析,就是因為相同文本的SQL語句存在于library cache中,所以本次SQL語句的解析就可以去掉硬解析中的一個活多個步驟。從而節省大量的資源的耗費。
3.軟軟解析
所謂的軟軟解析,就是不解析。當設置了session_cached_cursors參數時,當某個session第三次執行相同的SQL語句時,則會把該SQL語句的游標信息轉移到該session的PGA中。這樣,當該session在執行該SQL語句時,會直接從PGA中取出執行計劃,從而跳過硬解析的所有步驟。
SQL> show parameter cursor;
NAME???????????????????????????????? TYPE??????? VALUE
------------------------------------ ----------- ------------------------------
cursor_sharing?????????????????????? string????? EXACT
cursor_space_for_time??????????????? boolean???? FALSE
open_cursors???????????????????????? integer???? 300
session_cached_cursors?????????????? integer???? 20
open_cursors設定每個session(會話)最多能夠同時打開多少個cursors(游標)。
================================================
摘自:http://www.itpub.net/thread-796685-1-1.html
SESSION_CACHED_CURSORS的值就是說的是一個session可以緩存多少個cursor,讓后續相同的SQL語句不再打開游標,從而避免軟解析的過程來提高性能。(綁定變量是解決硬解析的問題),軟解析同硬解析一樣,比較消耗資源.所以這個參數非常重要。
oracle有一個概念,那就是session cursor cache,中文描述就是有一塊內存區域,用來存儲關閉了的cursor。當一個cursor關閉之后,oracle會檢查這個cursor的request次數是否超過3次,如果超過了三次,就會放入session cursor cache,這樣在下次parse的時候,就可以從session cursor cache中找到這個statement, session cursor cache的管理也是使用LRU。
session_cached_cursors這個參數是控制session cursor cache的大小的。session_cached_cursors定義了session cursor cache中存儲的cursor的個數。這個值越大,則會消耗的內存越多。
另外檢查這個參數是否設置的合理,可以從兩個statistic來檢查。
SQL>?select name,value from v$sysstat where name like '%cursor%';
NAME VALUE
---------------------------------------------------------------- ----------
opened cursors cumulative 16439
opened cursors current 55
session cursor cache hits 8944
session cursor cache count 101
cursor authentications 353
SQL>?select name,value from v$sysstat where name like '%parse%';
NAME VALUE
---------------------------------------------------------------- ----------
parse time cpu 0
parse time elapsed 0
parse count (total) 17211
parse count (hard) 1128
parse count (failures) 2
parse count(total)就是總的parse次數中,session cursor cache hits就是在session cursor cache中找到的次數,所占比例越高,性能越好。如果比例比較低,并且有剩余內存的話,可以考慮加大該參數。
Oracle 9i及以前,該參數缺省是0,10G上缺省是20。
轉載于:https://blog.51cto.com/wilsonking/1618007
總結
以上是生活随笔為你收集整理的SQL解析之硬解析和软解析的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python如何获取免费的可以商用的字体
- 下一篇: LINQ是死是活?——很奇怪为什么会有这