ORACLE 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
(遊標)。
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。
相關文章
- Oracle SQL的硬解析和軟解析OracleSQL
- ORACLE 硬解析和軟解析 軟軟解析Oracle
- Oracle的硬解析和軟解析Oracle
- 軟解析和硬解析
- Oracle 硬解析與軟解析Oracle
- 徹底弄懂oracle硬解析、軟解析、軟軟解析Oracle
- Oracle中的遊標、硬解析、軟解析、軟軟解析、解析失敗Oracle
- Oracle的軟解析(soft prase)和硬解析(hard prase)Oracle
- 共享池之八:軟解析、硬解析、軟軟解析 詳解一條SQL在library cache中解析涉及的鎖SQL
- SQL大致流程、SPM、軟軟、軟、硬解析SQL
- 草稿 - 遊標,硬解析,軟解析 等
- soft parse(軟解析),hard parse(硬解析)
- 【體系結構】sql語句解析過程小實驗 軟解析、硬解析SQL
- oracle實驗記錄 (分析oracle硬解析&軟解析&fast soft parse)OracleAST
- 硬解析和物理讀取與軟解析和邏輯讀取
- oracle實驗記錄 (分析oracle硬解析&軟解析&fast soft parse(2))OracleAST
- 軟解析、硬解析的一個小測試
- 在oracle 10.2.0.5分析硬解析及軟解析及軟軟解析獲取shared pool latch機制系列五Oracle
- Oracle - 共享遊標、父子游標、硬軟解析Oracle
- 硬解析物理讀VS軟解析邏輯讀 測試
- 13_共享SQL減少硬解析SQL
- ORACLE的軟 軟 軟 解析!Oracle
- grant 操作硬解析
- 查詢 分析硬解析較高的sql,SQL
- 父遊標 子游標和軟硬解析記載-02
- DOM解析和SAX解析
- Oracle中SQL解析的主要流程OracleSQL
- Oracle之dba_profiles解析Oracle
- 關於軟解析(soft parse)與硬解析(hard parse),以及session cached cursors (asktom)Session
- MySQL核心原始碼解讀-SQL解析之解析器淺析MySql原始碼
- 【軟考之線性表解析】
- Nginx(六):配置解析之location解析Nginx
- Spark SQL原始碼解析(四)Optimization和Physical Planning階段解析SparkSQL原始碼
- Pisa-Proxy SQL 解析之 Lex & YaccSQL
- Pisa-Proxy 之 SQL 解析實踐SQL
- V$SQL_SHARED_CURSOR檢視硬解析的原因SQL
- TS流解析之PMT表格解析(轉)
- TS流解析之PAT表格解析(轉)