1. 程式人生 > 其它 >[ORACLE] SQL執行

[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》

1 https://blog.csdn.net/w1014074794/article/details/44906845