Oracle Optimizer:遷移到使用基於成本的最佳化器-----系列1.1 (轉)
Optimizer:遷移到使用基於成本的器-----系列1.1:namespace prefix = o ns = "urn:schemas--com::office" />
如果在Oracle以前的版本(7.0或更早)中開發應用,會採用基於規則的最佳化器(譯者注:以下稱RBO),本篇將幫助你理解Oracle最佳化器並遷移到基於成本最佳化器(譯者注:以下稱CBO)的幾種高效方法.下面是五大部分的第一部分
第一部分
1. 什麼是最佳化器?
2. 為什麼要最佳化?
3. 可用的最佳化器.
4. 為什麼要移除RBO?
5. 為什麼要遷移到CBO?
第二部分
1. 影響CBO的初始化引數.
2. 影響CBO的Oracle內部引數.
第三部分
1. 升級至CBO的設定變化.
2. 生成統計資料
3. DML監視
第四部分
1. 提示.
2. 概要
3. SYS的統計資料
第五部分
1. 新的
2. 怎樣在CBO中分析計劃
3. Oracle Application 11i的CBO詳細資訊
4. 結論
1. 什麼是最佳化器?
在Oracle中,執行一個查詢可能有不只一種方法,擁有最佳等級的執行計劃,或者說是最度最少成本返回輸出並達到最佳資源利用的執行計劃.最佳化器生成執行計劃。最佳化器是執行在資料庫中致力以得到基於不同條件下執行路徑列表的引擎並且選擇執行查詢的最高效執行計劃。一旦執行計劃生成,它將執行輸出。在Oracle中最佳化器與DML語句有關.
2. 為什麼要最佳化?
你知道!最佳化一個針對執行時以最少時間和最佳的資源利用的查詢,意味著快速和高效。對於資源,意味著利用情況,輸入輸出,消耗和其它範圍的操作。不考慮你的在這些資源上是多麼充足,不適當或較不理想的的查詢總是付出昂貴的代價並拖慢你的任務,或者對伺服器上的其它處理產生影響.依賴於各種因素的查詢範圍是昂貴的,包括抽取的結果集大小,掃描檢索結果集的資料的大小和的即時負荷。適當的語法最佳化將節省執行時間的消耗和不必要的資源利用。
3. 可用的最佳化器
Oracle有兩種模式的最佳化器,基於規則和基於成本,它決定了最佳的執行計劃。
本篇重點介紹CBO,簡要概述RBO.
3.1 基於規則的最佳化(RBO)
RBO遵循簡單的分級方法學。RBO使用15種級別要點,當接收到查詢,最佳化器將評估使用到的要點數目,然後選擇最佳級別(最少的數量)的執行路徑來執行查詢,15個要點級別如下:
.使用ROWID的單獨記錄
.使用簇連線的單獨記錄.
.使用雜湊簇主鍵的單獨記錄.
.使用主鍵的單獨記錄.
.簇連線.
.雜湊簇連線
.簇主鍵.
.複合主鍵.
.單列主鍵.
.索引列的結合範圍查詢.
.索引列的非結合範圍查詢.
.排序合併連線.
.索引列的最大max或min
.索引列的order by.
.全表掃描.
舉例來說,如果生成一個在where子句條件中精確匹配兩列的表的查詢,一列擁有主鍵(對應於使用主鍵的單獨記錄.)而別一列擁有非主鍵(對應於單列主鍵),則RBO更喜歡主鍵(對應於使用主鍵的單獨記錄.),而不是非主鍵(對應於單列主鍵).
當在一個查詢中涉及到要訪問多個表,最佳化器需要確定那個表是表.RBO生成一組連線順序,每一個表做為第一個表,然後最佳化器從執行計劃的結果集中選擇最理想的計劃.最佳化器評估不同條件諸如(最少的巢狀迴圈,最少的排序合併連線,最佳級別的表訪問路徑,等等),如果仍然不能比較出結果,則最佳化器會選擇查詢的FROM子句第一個表作為驅動表.因此,常規條件下的編碼實踐將把驅動表放在最右邊.其它的表按訪問順序跟隨在FROM子句中. 也就是說,表的順序是從右到左的訪問順序。
請注意,用以搜尋列的運算子也扮演著決定級別的角色,有時甚至考慮索引的時間作為級別
例如下面的表證明瞭在列1和列2上的索引使用情況,如果它們兩個在where子句上用”=”連線
例:
* from am79 where col1 = 1 and col2 = 'amar';
-- here both col1 and col2 are indexed.
-------------------------------------------------------------------------------------
Normal index types | Index used in RBO
column1(a) column2(b) column1+column2(c) |
-------------------------------------------------------------------------------------
non-unique non-unique c
non-unique non-unique a + b
non-unique non-unique non-unique c
unique non-unique a
unique non-unique a
unique unique b (the most recent index created)
unique unique unique c
-------------------------------------------------------------------------------------
-The above is tested on Oracle 8.1.7.1.
-In case of non-unique single column indexes, both indexes are used.
-In case of unique indexes, they are not combined for execution plan, any one is taken.
-Preference is given to the index available with the "=" operator column, than with
others operators.
-Don't create bitmap & function-based indexes, these will not work in RBO.
-------------------------------------------------------------------------------------
RBO偏好Oracle早期版本的大多數設定作為執行計劃路徑,這種選擇是統一的。查詢總會產生同樣的方法對於執行在不同資料庫上相同的應用程式(待續).
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10752019/viewspace-963764/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 平安科技從 Oracle 遷移到 UbiSQL 的實踐OracleSQL
- 企業遷移到雲平臺是如何降低成本的?
- 將您的基於 Accelerator 的 SAP 電商雲 Storefront 遷移到 Spartacus Storefront
- Oracle 遷移到 OB 過程中的函式改造案例Oracle函式
- 使用DynamoShake從dynamodb遷移到mongodbMongoDB
- 從過時的 Windows 機器遷移到 LinuxWindowsLinux
- Nebula Graph 原始碼解讀系列 | Vol.04 基於 RBO 的 Optimizer 實現原始碼
- VMware虛擬機器遷移到PVE虛擬機
- Ora2Pg:將Oracle遷移到PostgreSQL的免費工具OracleSQL
- Oracle 10g(10.1.0.2)中的OPTIMIZER_INDEX_COST_ADJ(轉)Oracle 10gIndex
- 將 CentOS 8 作業系統遷移到 Oracle LinuxCentOS作業系統OracleLinux
- 遷移學習系列---基於例項方法的遷移學習遷移學習
- 基於成本的優化器 — 一般錯誤概念和問題(轉)優化
- github倉庫遷移到gitlab以及gitlab倉庫遷移到另一個gitlab伺服器GithubGitlab伺服器
- 騰訊雲伺服器遷移到Vultr伺服器
- 使用aliyun提供的遷移工具把本地的虛擬機器或主機遷移到阿里雲上去虛擬機阿里
- 並查集系列之「基於size的最佳化」並查集
- 並查集系列之「基於rank的最佳化」並查集
- svn 遷移到gitGit
- 使用SpringCloud將單體遷移到微服務SpringGCCloud微服務
- 【遷移】SqlServer 遷移到 MySQL 方法ServerMySql
- MySQL 5.5使用者遷移到5.7使用者MySql
- Oracle 遷移到 OB 過程中有哪些不相容的 DDL 語法?Oracle
- Oracle從Windows 11.2.0.1升級並遷移到Linux 19cOracleWindowsLinux
- 從eclipse遷移到idea(2 使用習慣篇)EclipseIdea
- WSL遷移到其他磁碟
- 基於機器學習預測Airbnb的城市旅行成本機器學習AI
- 微服務閘道器Zuul遷移到Spring Cloud Gateway微服務ZuulSpringCloudGateway
- 2.7.2 遷移到伺服器引數檔案(spfile)伺服器
- 騰訊廣告模型基於"太極"的訓練成本最佳化實踐模型
- 部落格園cnblog部落格遷移到Hexo(提供格式轉換)Hexo
- 從 Nginx 遷移到 Envoy ProxyNginx
- 從 golang flag 遷移到 cmdrGolang
- 將nodejs遷移到D盤NodeJS
- Python 決定遷移到 GitHubPythonGithub
- 如何將 CentOS遷移到 AlmaLinux?CentOSLinux
- centos遷移到rocky linux方法CentOSLinux
- uniapp小程式遷移到TSAPP
- 郵件伺服器遷移到 amazon aws 雲主機伺服器