[ORACLE] SQL執行
執行SQL的步驟:
輸入SQL->解析SQL->(解析後的SQL)->優化器->(執行計劃)->行源生成器->(查詢計劃/迭代計劃)->SQL引擎->(結果集)
一、SQL解析:
開始解析時,資料庫會建立一個遊標,存在於特定會話私有SQL去中。之後以分析的SQL語句和其他處理資訊都儲存在其中,SQL處理的最後一個步驟是關閉遊標。遊標和私有SQL區都位於PGA中。
分為硬解析和軟解析。
硬解析:在共享SQL區找不到該語句可以共用的SQL程式碼,需要重新完整的解析整個SQL,在通過優化器-行源生成器生成可執行的迭代計劃, 也稱為庫快取未命中。 資料庫對DDL始終執行硬解析。
軟解析:不是硬解析就是軟解析,在共享SQL區可以找到已經解析好的與該SQL相同的程式碼,資料庫直接重用該程式碼,直接執行,也稱為庫快取命中。
解析步驟:語法檢查-語義檢查-共享池檢查。
語法檢查:檢查SQL語句是否正確。
語義檢查:檢查表或檢視是否存在。
共享池檢查:檢查是否可以使用軟連線。
二、優化器
oracle 有兩種優化器:
基於 規則的優化器: Rule-Based Optimization(RBO)
基於 成本的優化器: Cost-Based Optimization ( CBO )
RBO:
RBO採用一套嚴格的規則,按照規則來寫sql會生成固定的執行計劃,不管其資料量如何,所以就導致了經常生成的執行計劃不是最優的執行計劃。 從oracle6開始一直用到oracle9i,到oracle10g就被拋棄了。
CBO:
CBO是比RBO可靠的優化器,CBO會綜合 查詢條 件、可用的訪問路徑、為系統收集的統計資訊、以及提示等,列出所有可能的執行計劃,估算出每個計劃的“成本”,選擇成本最低的執行計劃進行執行。
CBO的元件:
查詢轉換器(Query Transformer):
在執行查詢語句時,oracle後改寫查詢語句,搜尋其他的資料來源(例如物化檢視等),在保證相同結果的情況下,提高執行效率,這叫做查詢重寫。查詢轉換器確認更改查詢的語句是否有助於優化器生成一個更好的查詢計劃,若可以則會執行查詢重寫。
估算器(Estimator):
估算器估算給定的執行計劃的總成本,主要基於以下4點因素: 選擇性、 基數、 成本、 統計資訊
計劃生成器會考慮可能的訪問路徑、關聯方法和關聯順序,生成不同的執行計劃,讓查詢優化器從這些計劃中選擇出執行代價最小的一個計劃。
計劃生成器(Plan Generator):
對提交的查詢嘗試不同的計劃,選擇出具有最低成本的計劃
優化器提示(Hint):
如果希望優化器按照程式設計人員的要求來執行,需要使用提示。有以下優化方式:
ALL_ROWS :使用CDO,以獲得最佳吞吐量(資源消耗最小)為目標優化。
FIRST_ROWS:使用CDO,以返回首行的資源最小化為目標優化。
CHOOSE:如果資料字典中有該表的統計資訊,使用CBO,以最佳吞吐量為目標,若資料字典中沒有該表的統計資訊,使用RBO。
RULE:使用RBO。
三、行源生成器(Row Source Generator):
是一個軟體,接收執行計劃,生成一個稱為查詢計劃的迭代計劃,供SQL引擎執行。
四、SQL引擎
SQL引擎執行計劃返回了結果集。
## 參考
《ORACLE 11G CONCEPTS》
https://blog.csdn.net/w1014074794/article/details/44906845
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69996961/viewspace-2765286/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Oracle sql執行計劃OracleSQL
- Oracle - 執行過的SQL、正在執行的SQL、消耗資源最多的SQLOracleSQL
- oracle查詢sql執行耗時、執行時間、sql_idOracleSQL
- 後臺執行SQL語句(oracle)SQLOracle
- EBS:Oracle 資料庫執行慢SQLOracle資料庫SQL
- java連線oracle執行sql語句JavaOracleSQL
- 【SQL】Oracle避免動態SQL,提高過程執行效率SQLOracle
- Oracle SQL Profile固定執行計劃的方法OracleSQL
- Oracle提高SQL執行效率的三種方法ITOracleSQL
- Oracle資料庫SQL語句執行過程Oracle資料庫SQL
- oracle 透過pid 找到sid 再找出執行sqlOracleSQL
- 查詢oracle正在執行的SQL和事務OracleSQL
- 【SQL】Oracle sql語句 minus函式執行效率與join對比SQLOracle函式
- .Oracle固定執行計劃之SQL PROFILE概要檔案OracleSQL
- oracle常用後臺程序及sql語句執行流程OracleSQL
- 獲取oracle sql語句詳細些執行計劃OracleSQL
- Oracle資料庫關於SQL的執行計劃(轉)Oracle資料庫SQL
- 在Oracle裡提高SQL執行效率的三種方法NQOracleSQL
- 【TUNE_ORACLE】定製化執行計劃SQL參考OracleSQL
- Oracle檢視sql_id 的歷史執行計劃OracleSQL
- Oracle DB 相關常用sql彙總7【手工繫結sql執行計劃】OracleSQL
- MyBatis SQL執行MyBatisSQL
- PHP執行sqlPHPSQL
- 查詢Oracle正在執行的sql語句及執行該語句的使用者OracleSQL
- 【SQL_PLAN】Oracle 透過檢視sql_plan 格式化執行計劃SQLOracle
- 【SQL】Oracle資料庫監控sql執行情況SQLOracle資料庫
- Oracle優化案例-從執行計劃定位SQL問題(三)Oracle優化SQL
- SQL 執行 - 執行器最佳化SQL
- peewee 執行原生 sqlSQL
- Sql執行順序SQL
- Oracle利用coe_load_sql_profile指令碼繫結執行計劃OracleSQL指令碼
- Oracle執行語句跟蹤 使用sql trace實現語句追蹤OracleSQL
- mybatis執行sql指令碼MyBatisSQL指令碼
- SQL 解析與執行流程SQL
- SQL是如何執行的SQL
- postgresql怎麼執行sqlSQL
- 一次搞定各種資料庫SQL執行計劃:MySQL、Oracle、SQL Server、PostgreSQL以及SQLite資料庫MySqlOracleServerSQLite
- oracle 固定執行計劃Oracle