SQL解析之硬解析和软解析
當(dāng)客戶端進(jìn)程,將SQL語句通過監(jiān)聽器發(fā)送到Oracle時, 會觸發(fā)一個Server process生成,來對該客戶進(jìn)程服務(wù)。Server process得到SQL語句之后,對SQL語句進(jìn)行Hash運算,然后根據(jù)Hash值到library cache中查找,如果存在,則直接將library cache中的緩存的執(zhí)行計劃拿來執(zhí)行,最后將執(zhí)行結(jié)果返回該客戶端,這種SQL解析叫做軟解析;如果不存在,則會對該SQL進(jìn)行解析parse,然后執(zhí)行,返回結(jié)果,這種SQL解析叫做硬解析。
1.硬解析的步驟
硬解析一般包括下面幾個過程:
1)對SQL語句進(jìn)行語法檢查,看是否有語法錯誤。比如select from where 等的拼寫錯誤,如果存在語法錯誤,則推出解析過程;
2)通過數(shù)據(jù)字典(row cache),檢查SQL語句中涉及的對象和列是否存在。如果不存在,則推出解析過程。
3)檢查SQL語句的用戶是否對涉及到的對象是否有權(quán)限。如果沒有則推出解析;
4)通過優(yōu)化器創(chuàng)建一個最優(yōu)的執(zhí)行計劃。這個過程會根據(jù)數(shù)據(jù)字典中的對象的統(tǒng)計信息,來計算多個執(zhí)行計劃的cost,從而得到一個最優(yōu)的執(zhí)行計劃。這一步涉及到大量的數(shù)據(jù)運算,從而會消耗大量的CPU資源;(library cache最主要的目的就是通過軟解析來減少這個步驟);
5)將該游標(biāo)所產(chǎn)生的執(zhí)行計劃,SQL文本等裝載進(jìn)library cache中的heap中。
2.軟解析
所謂軟解析,就是因為相同文本的SQL語句存在于library cache中,所以本次SQL語句的解析就可以去掉硬解析中的一個活多個步驟。從而節(jié)省大量的資源的耗費。
3.軟軟解析
所謂的軟軟解析,就是不解析。當(dāng)設(shè)置了session_cached_cursors參數(shù)時,當(dāng)某個session第三次執(zhí)行相同的SQL語句時,則會把該SQL語句的游標(biāo)信息轉(zhuǎn)移到該session的PGA中。這樣,當(dāng)該session在執(zhí)行該SQL語句時,會直接從PGA中取出執(zhí)行計劃,從而跳過硬解析的所有步驟。
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設(shè)定每個session(會話)最多能夠同時打開多少個cursors(游標(biāo))。
================================================
摘自:http://www.itpub.net/thread-796685-1-1.html
SESSION_CACHED_CURSORS的值就是說的是一個session可以緩存多少個cursor,讓后續(xù)相同的SQL語句不再打開游標(biāo),從而避免軟解析的過程來提高性能。(綁定變量是解決硬解析的問題),軟解析同硬解析一樣,比較消耗資源.所以這個參數(shù)非常重要。
oracle有一個概念,那就是session cursor cache,中文描述就是有一塊內(nèi)存區(qū)域,用來存儲關(guān)閉了的cursor。當(dāng)一個cursor關(guān)閉之后,oracle會檢查這個cursor的request次數(shù)是否超過3次,如果超過了三次,就會放入session cursor cache,這樣在下次parse的時候,就可以從session cursor cache中找到這個statement, session cursor cache的管理也是使用LRU。
session_cached_cursors這個參數(shù)是控制session cursor cache的大小的。session_cached_cursors定義了session cursor cache中存儲的cursor的個數(shù)。這個值越大,則會消耗的內(nèi)存越多。
另外檢查這個參數(shù)是否設(shè)置的合理,可以從兩個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次數(shù)中,session cursor cache hits就是在session cursor cache中找到的次數(shù),所占比例越高,性能越好。如果比例比較低,并且有剩余內(nèi)存的話,可以考慮加大該參數(shù)。
Oracle 9i及以前,該參數(shù)缺省是0,10G上缺省是20。
轉(zhuǎn)載于:https://blog.51cto.com/wilsonking/1618007
總結(jié)
以上是生活随笔為你收集整理的SQL解析之硬解析和软解析的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python如何获取免费的可以商用的字体
- 下一篇: SQL 取n到m条记录