SQL在Oracle內部的具體處理流程
顯示了SQL在Oracle內部處理的一般階段:解析、最佳化、產生行源和執行。資料庫可能會忽略某些步驟,這取決於具體的語句。
1,SQL解析
SQL處理的第一階段就是SQL解析。當應用程式發出SQL語句時,該應用程式向資料庫發出一個解析調用,以準備執行該語句,解析調用會開啟或建立一個遊標,它是一個對特定於會話的私人SQL區的控制代碼,其中包含了已分析的SQL語句和其他處理資訊。遊標和私人SQL區位於PGA中。 解析調用期間,資料庫會執行以下檢查: ● 語法檢查 ● 語義檢查 --對象和列是否存在 ● 共用池檢查 資料庫執行共用池檢查,以確定時候可以跳過佔用大量資源的語句處理步驟。為此,資料庫使用一種雜湊演算法為每個SQL語句產生一個雜湊值。語句的雜湊值即是在V$SQL.SQL_ID中顯示的SQL_ID(參考筆記:區分4個與sql相關的欄位:hash_value、sql_hash_value、plan_hash_value 和 sql_id),當使用者提交一個SQL語句時,資料庫搜尋共用SQL區,以查看是否存在一個現成的已分析的語句具有相同的雜湊值。SQL語句的雜湊值有別於下列值: ● 該語句的記憶體位址值(V$sql的address欄位值) ● 該語句執行計畫的雜湊值(V$SQL_PLAN視圖的plan_hash_value欄位值) 基於所提交語句的類型和雜湊檢查的結果,解析操作分為以下類別: ● 硬解析 如果資料庫不能重用現有代碼,則它必鬚生成應用程式代碼的一個新的可執行版本,次操作稱為一個硬解析,或庫緩衝未命中。資料庫對DDL始終執行硬解析。 在硬解析期間,資料庫多次訪問庫緩衝和資料字典緩衝以檢查資料字典。當資料庫訪問這些地區時,它在所需對象上使用一個叫做閂鎖的序列化裝置,以便它們的定義不糊被更改。閂鎖的爭用會增加語句的執行時間,並降低並發性。 ● 軟解析 任何不適硬解析的解析都是軟解析。如果提交的語句與在共用式中某個可重用SQL語句相同,則資料庫將重用該現有代碼。重用代碼也稱為庫快取命中。 一般的,軟解析比硬解析更可取,因為資料庫可以跳過最佳化和行源產生步驟,而直接進入到直行階段。是在專用伺服器體繫結構中,一個update語句的共用池檢查的簡化表示。 (看來,SQL文本的雜湊值是在PGA中產生的)。 如果檢查到共用庫中有一個語句具有相同的雜湊值,則資料庫在執行語義和環境檢查(工作區大小或最佳化器設定等),當然還有語句本身的書寫(大小寫,空格,注釋等)。 詳情可參見筆記:《Oracle效能調優之硬解析與軟解析》 2,SQL最佳化 查詢最佳化是選擇執行SQL語句的最有效手段的過程。資料庫對查詢的最佳化基於對正在訪問的實際資料收集的統計資訊。最佳化器使用行數、資料集大小 和 其他因素來產生各種可能的執行計畫,並為每個計劃分配一個成本值。資料庫會使用具有最低成本的計劃。 資料庫對每個唯一的DML語句必須至少執行一次硬解析,並在硬解析期間執行最佳化。DDL永遠不會被最佳化,除非他包括需要最佳化的DML組件,如子查詢。 3,SQL行源產生 行源產生器是一種軟體,它從最佳化器接受經過最佳化的執行計畫,並產生一個稱為查詢計劃的反覆項目計劃,一共資料庫的其餘部分使用。查詢計劃採用組合多個步驟的形式,每一步返回一個行集。該集合中的行可以在下一步被使用,火災最後一步返回給發出SQL語句的應用程式。 行源就是執行計畫中的某一步多返回的行集,且帶有能夠迭代該行集的控制結構,行源可以是表、視圖、或串連操作或分組操作的結果。 行源產生器產生一個行源樹,它是一個行源的集合。(就是我們看到的執行計畫) 4,SQL執行 在執行期間,SQL引擎執行行源產生器所產生的數中的每個行源。這一步是在DML處理中唯一的強制性步驟。在執行計畫中,我們經常看到就是的一個執行樹,顯示了行源從一部流向另一步。通常,執行步驟的順序與幾乎是順序相反,所以我們應該從底向上來閱讀計劃。在operation列中的初始空格展示層次結構關係。例如,如果一個操作的名稱前面有兩個空格,則此操作是前面有一個空格的操作的子操作。前面有一個空格的操作是select語句本身的子操作。參考:http://docs.oracle.com/cd/E11882_01/server.112/e40540/sqllangu.htm#CNCPT216