下圖顯示了SQL在Oracle內部處理的一般階段:解析、優化、產生行源和執行。數據庫可能會忽略某些步驟,這取決于具體的語句。
(看來,SQL文本的哈希值是在PGA中產生的)。
如果檢查到共享庫中有一個語句具有相同的哈希值,則數據庫在執行語義和環境檢查(工作區大小或優化器設置等),當然還有語句本身的書寫(大小寫,,空格,注釋等)。
詳情可參見筆記:《Oracle性能調優之硬解析與軟解析》
2,SQL優化
查詢優化是選擇執行SQL語句的最有效手段的過程。數據庫對查詢的優化基于對正在訪問的實際數據收集的統計信息。優化器使用行數、數據集大小 和 其他因素來生成各種可能的執行計劃,并為每個計劃分配一個成本值。數據庫會使用具有最低成本的計劃。
數據庫對每個唯一的DML語句必須至少執行一次硬解析,并在硬解析期間執行優化。DDL永遠不會被優化,除非他包括需要優化的DML組件,如子查詢。
3,SQL行源生成
行源生成器是一種軟件,它從優化器接受經過優化的執行計劃,并生成一個稱為查詢計劃的迭代計劃,一共數據庫的其余部分使用。查詢計劃采用組合多個步驟的形式,每一步返回一個行集。該集合中的行可以在下一步被使用,火災最后一步返回給發出SQL語句的應用程序。
行源就是執行計劃中的某一步多返回的行集,且帶有能夠迭代該行集的控制結構,行源可以是表、視圖、或連接操作或分組操作的結果。
行源生成器產生一個行源樹,它是一個行源的集合。(就是我們看到的執行計劃)
4,SQL執行
在執行期間,SQL引擎執行行源生成器所產生的數中的每個行源。這一步是在DML處理中唯一的強制性步驟。在執行計劃中,我們經常看到就是的一個執行樹,顯示了行源從一部流向另一步。通常,執行步驟的順序與幾乎是順序相反,所以我們應該從底向上來閱讀計劃。在operation列中的初始空格表示層次結構關系。例如,如果一個操作的名稱前面有兩個空格,則此操作是前面有一個空格的操作的子操作。前面有一個空格的操作是select語句本身的子操作。
參考:#CNCPT216
聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com