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的軟解析(soft prase)和硬解析(hard prase)Oracle
- Oracle - 共享遊標、父子游標、硬軟解析Oracle
- 軟解析、硬解析的一個小測試
- ORACLE的軟 軟 軟 解析!Oracle
- grant 操作硬解析
- Spark SQL原始碼解析(四)Optimization和Physical Planning階段解析SparkSQL原始碼
- MySQL核心原始碼解讀-SQL解析之解析器淺析MySql原始碼
- Pisa-Proxy 之 SQL 解析實踐SQL
- Pisa-Proxy SQL 解析之 Lex & YaccSQL
- Sharding-JDBC 原始碼之 SQL 解析JDBC原始碼SQL
- Oracle體系結構概述與SQL解析剖析OracleSQL
- Nginx(六):配置解析之location解析Nginx
- Oracle redo解析之-2、BBED & DUMP工具使用Oracle Redo
- Oracle redo解析之-4、rowid的計算Oracle Redo
- Oracle redo解析之-3、常見change分析Oracle Redo
- [原始碼解析] GroupReduce,GroupCombine 和 Flink SQL group by原始碼SQL
- oracle json 解析函式OracleJSON函式
- 解析訊息中介軟體之RabbitMQMQ
- 淺談DNS遞迴解析和迭代解析之間的區別DNS遞迴
- 深入解析和定製Oracle優化工具Oracle優化
- dom解析和sax解析的區別
- Oracle redo解析之-1、oracle redo log結構計算Oracle Redo
- Shading – jdbc 原始碼分析(三) – sql 解析之 SelectJDBC原始碼SQL
- Mybatis原始碼解析之執行SQL語句MyBatis原始碼SQL
- SQL 解析與執行流程SQL
- SQL解析器詳解SQL
- python之XML解析PythonXML
- MuJoCo解析之 mjData
- 解析-解析器
- mybatis原始碼學習------resultMap和sql片段的解析MyBatis原始碼SQL
- Mybatis(一)Porxy動態代理和sql解析替換MyBatisSQL
- 解析 SQL 的 java 類庫 jsqlparserSQLJavaJS
- openGauss核心:SQL解析過程分析SQL
- Oracle ocp 052題庫解析2Oracle
- ORACLE 資料塊格式深入解析Oracle
- 什麼是DNS雲解析?雲解析和普通解析有什麼區別?DNS
- DNS遞迴解析和迭代解析的區別-VeCloudDNS遞迴Cloud
- spring原始碼深度解析— IOC 之 自定義標籤解析Spring原始碼