1. 程式人生 > >基於Oracle的SQL優化--學習(一)

基於Oracle的SQL優化--學習(一)

Oracle裡的優化器

    Oracle裡的優化器分為RBO和CBO兩種型別,RBO是基於規則的優化器,CBO是基於成本的優化器。

    Oracle資料庫的SQL語句執行過程:


    基於規則的優化器

   Oracle會在程式碼裡事先給各個型別的執行路徑定一個等級,從等級1到等級15,等級越低執行效率越快。等級1對應的執行路徑是“single row by rowid(通過rowid來訪問單行資料)”,等級15對應的執行路徑是“full table scan(全表掃描)”。

   當目標SQL有兩條或者兩條以上的執行路徑等值相同時,我們可以通過調整相關物件在資料字典快取中的快取順序來影響RBO對其執行計劃的選擇;當目標的SQL中出現多表連線的情況RBO會按照從右到左的順序來決定誰是驅動表誰是被驅動表,進而選擇執行計劃。所以還可以通過改變目標SQL中涉及的各個物件在SQL文字中的先後順序,來改變表連線的驅動表和被驅動表,進而調整SQL的執行計劃。

   當目標SQL有兩條或者兩條以上的執行路徑等值不相同時,那麼無論怎麼調整相關物件在SQL文字中的順序都不會對執行計劃起作用。

基於成本的優化器

   Oracle裡的成本是對執行目標SQL所耗費的I/O、CPU和網路資源的一個估算值。

        集的勢:            Cardinality,指指定集合所包含的記錄數。即指定結果集的行數。表示對目標SQL的某個具體執行步驟的執行結果所包含的記錄數的估算。當然,如果是針對整個目標SQL,那麼此時的Cardinality就表示對該SQL最終執行結果所包含的記錄數的估算。某個執行步驟的對應Cardinality值越大,那麼所對應的成本值往往也就越大,這個執行步驟所在執行路徑的總成本值也就會越大。        可選擇率:            Selectivity,指施加指定謂詞條件後返回結果集的記錄數佔未施加任何謂詞條件的原始結果集的記錄數的比率。可選擇率的值越大,就意味著返回結果集的Cardinality的值就越大,所以估算出來的成本值也就會越大。

   CBO優化器的可傳遞性:

 CBO會對原目標SQL做簡單的等價改寫,這樣可以提供更多的執行路徑給CBO做選擇。

            1、簡單謂詞傳遞 ,t1.c1=t2.c1 and t1.c1=10,Oracle會自動將t2.c1=10的條件新增。            2、連線謂詞傳遞,t1.c1=t2.c1 and t2.c1=t3.c1,Oracle會自動將t1.c1=t3.c1的條件新增。            3、外連線謂詞傳遞,t1.c1=t2.c1(+) and t1.c1=10,Oracle會自動將t2.c1(+)=10的條件新增。        CBO的侷限性:
            1、CBO會預設目標SQL語句where條件中出現的各個列之間是獨立的,沒有關聯關係。            2、CBO會假設所有的目標SQL都是單獨執行的,並且互不干擾。不考慮SQL執行已經快取到Buffer Cache,下次執行不需要訪問物理IO到磁碟讀索引葉子塊、資料塊等,高估用索引的成本。            3、CBO對直方圖統計資訊有諸多限制。            4、CBO在解析多表關聯的目標SQL時,可能會漏選正確的執行計劃。






相關推薦

基於Oracle的SQL優化--學習

Oracle裡的優化器    Oracle裡的優化器分為RBO和CBO兩種型別,RBO是基於規則的優化器,CBO是基於成本的優化器。    Oracle資料庫的SQL語句執行過程:    基於規則的優化器   Oracle會在程式碼裡事先給各個型別的執行路徑定一個等級,從等級

Unity GC優化學習:認識堆(heap)&棧(stack)

儘管在.NET framework 下我們並不需要擔心記憶體管理和垃圾回收(GarbageCollection),但是我們還是應該瞭解它們,以優化我們的應用程式。 同時還需要具備一些基礎的記憶體管理工作機制的知識,這樣有助於解釋日常程式編寫中的變數的行為。

演算法學習揹包佇列和棧優化

以棧為例,之前是增加一個元素就要重新new一個比原來大1的陣列出來替換原始陣列。 public void Push(T item) { int size = Size(); T[] newarray = new T[size + 1]; for (int i =

MATLAB R2018a 全域性優化工具箱學習遺傳演算法

Global Optimization Toolbox   在MATLAB R2018a 中發現了全域性優化的工具箱以及增加的資料和機器學習工具箱,對於求解全域性最優值很是方便。 MATLAB Global Optimization Toolbox 學習: 全域性

基於c++的網路開發庫boost.Asio學習 Ubuntu安裝boost以及問題解決

執行環境:Ubuntu 12.04   版本: boost 1.68 下載網址:http://sourceforge.net/projects/boost/files/boost/1.58.0/boost_1_58_0.tar.bz2/download

Windows下基於Caffe的SSD網路學習配置加生成自己的資料集

    最近準備要做畢業設計了,所以從頭又配了一遍Caffe,學了一遍SSD,看了Caffe的原始碼,準備對SSD網路做一些改進。由於這已經是第n遍配置Caffe了,但是還是費了不少時間,所以意識到,總結還是很重要的,所以寫下部落格記錄這一路如何走來,同時也希望可以給有需

muduo網路庫學習對io複用的封裝Poller,面向物件與基於物件

高效併發的網路框架大多離不開io多路複用函式,Linux下有三種 select poll epoll 關於三者的區別可以參考 linux網路程式設計—–幾種伺服器模型及io多路複用函式 前段時間看Libevent原始碼時也學習過對epoll/poll/

Node個人學習----模塊

需要 區別 class 當前 個人 一個 min export ava 1、自定義模塊與系統模塊的引入方式區別:----自定義模塊需要加“./”來聲明它不是一個系統模塊 const mod1=require("系統模塊.js"); const mod1=require(

MySQL學習ODBC 安裝

oca local new cmd 密碼 服務 關閉 mysql 系統 寫前說明 初次接觸MySQL,都說MySQL各種好。我也來學習學習。之前只有SQLServer2008的經驗,其實也只是皮毛。因為SQLServer還是比較容易上手的。也不麻煩。但是自己

vue基礎學習

time tle eight pla use logs new dial for 01-01 vue使用雛形      <div id="box"> {{msg}} </div> <sc

java學習 環境搭建、hello world的demo

環境變量 網上 類庫 .com java開發 www cnblogs rgs .class   本程序媛搞前端的,上班偶有空閑,不妨來學習學習,不然怎麽包養小白臉,走上人生巔峰?   說實話,每個語言都相通,有了javascript的基礎,並且有了兩三年跟java打交道的經

【Cloud Foundry】Could Foundry學習——Could Foundry淺談

art lock mod out isp ted 組成 .com pop 在閱讀的過程中有不論什麽問題。歡迎一起交流 郵箱:[email protected]/* */ QQ:1494713801 Cloud Foundry是VMware

Android中關於JNI 的學習對於JNIEnv的一些認識

else size 初步 jint 使用 包括 pri jnienv 就會 一個簡單的樣例讓我們初步地了解JNI的作用,可是關於JNI中的一些概念還是須要了解清楚,才可以更好的去利用它來實現我們想要做的事情。 那麽C++和Java之間的是怎樣通過JNI來進行互相調用的呢

.Net MVC的學習

後綴 fonts mvc 存在 eth 大致 例如 pre gb2   套種間作,也挺有意思的——近來學習感悟。DRP學習的同一時候,折騰了點曾經不曾學習可是卻非常多次耳聞過的東西——Asp.Net中的MVC架構模式。 一、是什麽?      MVC,即(Model-

Python學習

ubun 安裝目錄 tle setup extract reat 常用插件 增加 網址 Python學習(一) 一:開發工具安裝   1,pycharm下載:Linux版本   2,破解:在help-register下-service輸入:      http://elpo

Web Service學習

內存 res 特性 response 屬性表 高性能 fas str ima 1、WebMethod特性包含哪些屬性,都有什麽用? 1、BufferResponse屬性 該屬性表明是否啟用對Web Service方法響應的緩沖。當設置為true時,Web Service

Python基礎學習

func exe function 學習 typeerror exit invalid min eas #Default Argument Values & in keyworddef ask_ok(prompt, retres=4, reminder=‘pleas

Django學習---基本配置及創建項目、應用

cut 維護 onf response settings 通過 學習 clu render 安裝:在Django官網下載最新版Django然後通過pip安裝即可 一、創建項目 進入文件夾,打開cmd窗口,輸入django-admin startproject myblog(

機器學習

無限 size mage 計算機 博客 對數 png 表示 獲得 對學習的定義 學習經驗E 完成任務T 績效指標P 對於某類任務T和性能度量P,如果一個計算機程序在完成T上以P來衡量完成的好壞,並隨著經驗E而自我完善,那麽我們稱這個計算機程序在從經驗E中學習

Linux服務器學習

-1 修改 感覺 img size 地址 mage 第一次 spa 一、首先連接服務器   下載一個windows下連接linux的ssh工具,我這裏用的putty。一次填入HostName(主機名,可以是服務器域名也可以是對應的ip)、Port(端口號默認為22)、Co