oracle随机备选数,Oracle查询优化器(一)
本系列文章將會介紹Oracle數據庫中核心組件之一的查詢優化器,并嘗試從SQL執行的角度來介紹查詢優化器的基礎概念、組成以及工作原理。
SQL
眾所周知,SQL是一種結構化的查詢語言。我們在使用SQL編寫查詢語句的時候,并不會指定從數據庫中查詢數據的方式,而是會用直觀的方式列出數據的查詢需求。以下述SQL語句為例:
select age from student where sno = 1;
SQL語句列出查詢需求:從student表中查詢學號為1的學生的年齡。作為SQL的編寫人員,并不需要知道數據庫內部的工作原理,只需要列出這樣的一種查詢需求,數據庫內部的諸多組件就會互相協同,按照規范化的步驟從數據庫中查詢出結果。
查詢優化器的概念
在Oracle數據庫的諸多組件中,查詢優化器(以下簡稱優化器)的職責是為SQL語句生成執行計劃。基于SQL結構化語言的特點,優化器在為特定SQL生成執行計劃的時候會面臨如下常見問題:
1)從SQL中涉及到的每一個表查詢數據的最優訪問路徑是什么?
2)SQL中涉及到的多個表以哪種連接方式、和連接順序進行連接最高效?
3)在SQL語句執行期間,什么時候應該處理聚合和/或排序?
在實際情況中,優化器并不會直接回答這些問題。優化器會搜索所謂的search space(其中包含所有潛在的執行計劃)以追求最優的執行計劃。為了確定哪個執行計劃是最優的,優化器會評估執行計劃的成本,并選擇成本最低的一個。這種類型的優化器被稱作基于成本的優化器,即CBO。從Oracle 10g起RBO(基于規則的查詢優化器)不再被Oracle支持,因此我們在此不再介紹RBO。
Branch-and-Bound
我們知道,優化器需要在有限的時間內找到代價最小的執行計劃。因此可以理解,對于優化器而言,它并不會經常搜索一個SQL語句的所有可能的執行計劃(可能會耗費大量時間)。優化器通過所謂啟發式的方法來搜索所有可能執行計劃的一個子集。具體來說,優化器通過branch-and-bound算法來評估最有希望的執行計劃,然后考慮不同的執行計劃,直到找到代價最低的執行計劃或探測到過多的執行計劃為止。
Branch-and-bound算法中,branch指代可選的執行計劃分支(如,一個訪問路徑或一個連接方法),而bound指代優化器搜索最優執行計劃過程中找到的迄今為止最佳執行計劃的成本——一旦當前執行計劃分支的成本高于bound,優化器就會直接丟棄該branch(可能還有branch下列的所有子branch)。通過采用這種算法,優化器可以做到在合理的時間范圍內確定最高效的執行計劃。
查詢優化器的組成
查詢優化器由三部分組成:查詢轉換器(Query Transformer)、成本估算器(Estimator)、計劃生成器(Plan Generator)。圖一展示了查詢優化器中三個組成部分的關系。
圖一 查詢優化器.png
查詢轉換器
優化器通過在查詢轉換器中應用不同的查詢轉換技術生成新的語義上等價的SQL語句。這一階段稱又可稱作邏輯優化。邏輯優化的目標是確定查詢轉換的最佳組合(或是否需要做查詢轉換)。優化器通過邏輯優化這一過程來明確更改查詢的形式是否有助于其生成更好的執行計劃,如果有那就更改,反之則保持原樣。
成本估算器
在查詢轉換器處理之后,優化器會為每個SQL語句會生成若干個不同的執行計劃。而后,每一個執行計劃都會被傳遞給成本估算器,讓它計算成本。最后,優化器選擇成本最低的執行計劃。這一階段可稱為物理優化。在物理優化的過程中,成本估算器需要根據數據字典中的統計信息來確定執行計劃的代價。
計劃生成器
經過查詢轉換器和成本估算器之后,優化器比較所有備選的執行計劃并選擇成本最低的計劃傳遞給行源生成器。行源生成器從優化器接收到優化后的執行計劃,然后為該計劃生成行源(Row Source),并最終傳遞給執行引擎(只有經過行源生成器處理過的執行計劃才能被執行引擎使用)。
本文簡單介紹了查詢優化器的概念以及搜索執行計劃的核心算法Branch-and-Bound、查詢優化器的組成部分等內容。在系列后續文章中,將會詳細介紹查詢優化器的各個組件的技術細節,敬請期待!
總結
以上是生活随笔為你收集整理的oracle随机备选数,Oracle查询优化器(一)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: oracle输出异常,表导出出现异常,无
- 下一篇: oracle ora-01001,ORA