[TOC]html
在看《基於Oracle的SQL優化一書》知道了不少專業名稱,作了記錄,CBO、優化器、查詢轉換、執行計劃、Hint、並行、遊標、綁定變量、統計信息、直方圖、索引等等。這篇博客能夠說是讀書筆記sql
1、Oracle的優化器
1.1 優化器簡介
優化器(Optimizer):優化器是Oracle數據庫內置的一個核心子系統,負責解析SQL,Oracle優化器是Oracle系統的一個核心組件,其目的是按照必定的原則來獲取目標SQL在當前情形下執行的最高效執行路徑,也能夠說是執行計劃。數據庫
1.2 SQL執行過程
Oracle SQL的執行過程:緩存
2、優化器優化方式
2.1 優化器的優化方式
Oracle優化器按照優化方式分爲兩種網絡
- 基於規則的優化器(Rule-Based Optimizer),簡稱RBO
- 基於成本的優化器(Cost-Based Optimizer),簡稱CBO
2.2 基於規則的優化器
2.2.1 RBO簡介
基於規則的優化器(Rule-Based Optimizer):所謂基於規則的優化器是指Oracle按照硬編碼在數據庫的一系列規則來決定SQL的執行計劃,簡稱是RBOsession
2.2.2 RBO缺陷
RBO在oracle10後官方就不建議用,由於RBO並不支持oracle一些性能比較好的功能特性,也不會根據表的數據量等等獲取執行計劃,並且RBO定的那些規則也不是很容易修改。不過代碼在oracle10後版本仍是保存的,因此要學習測試也能夠用SQL開啓RBO模式oracle
alter session set optimizer_mode='RULE';
2.2.3 RBO執行過程
RBO的執行過程:對於一條sql,oracle會事先給sql各類狀況的執行計劃定一個等級,一共有15個等級,從等級1到等級15,規則是等級越低執行效率越高,也就是等級1的執行計劃執行效率是最高的。而後oracle天然就選出等級1的執行路徑做爲執行計劃。函數
2.2.4 RBO特殊狀況
- 對於執行路徑同樣的狀況:假如出現執行路徑同樣的狀況,這時候就要根據數據字典緩存來肯定最低的等級了,意思就是獲取緩存中的前後順序肯定哪條做爲執行計劃
2.2.5 強制CBO的狀況
上面說了能夠經過SQL開啓CBO模式,這是針對普通狀況的,假如出現下面狀況,那就是強制使用CBO性能
- SQL涉及對象有IOT(Index Organized Table)
- SQL涉及的對象分區表
- 使用了並行查詢或者並行DML
- 使用了星型鏈接
- 使用了哈希鏈接
- 使用了索引快速全掃描
- 使用了函數索引
- ....
這些狀況總結來自《基於Oracle的SQL優化一書》學習
雖然Oracle針對上述狀況都開啓了強制CBO,可是咱們仍是能夠手動解決的,方法也是來自《基於Oracle的SQL優化一書》,做者提供了改寫等價sql的方法,好比在sql的where條件中對number或者date類型的列加0,
select * from 表格 where a+0>參數
若是是varchar2類型的,加能夠加個空字符串
select * from 表格 where a || '' = 參數
2.3 基於成本的優化器
2.3.1 CBO簡介
介紹一下基於成本的優化器(Cost-Based Optimization):基於成本的優化器簡稱是CBO,在SQL執行過程,會緩存執行的一些信息到Oracle的數據字典裏,這裏的信息就有sql執行路徑的I/O、網絡資源、CPU的使用狀況,其實這個就是SQL的執行成本,也是按照這個成原本肯定執行計劃。因此CBO概念就是根據I/O、網絡資源、CPU的使用狀況來肯定SQL執行路徑也能夠說是執行計劃的優化器。
2.3.2 集的勢
集的勢(Cardinality)是CBO特有的概念,集的勢指結果集的行數。引入這個概念是爲了表示SQL執行成本值,Cardinality越大,也就是說sql執行返回的結果集所包含的行數就越多,也說明成本越大。
2.3.3 可選擇率
可選擇率(Selectivity):指施加指定謂語條件後返回結果集的記錄數佔未施加任何謂語條件的原始結果集的記錄數的比率。可選擇率的範圍是0~1,它的值越小,說明可選擇性越好,值越大說明可選擇性越差,也就是成本值越大。可選擇率爲1時性能是最差的。
可選擇率 = 施加指定謂語條件後返回結果集的記錄數/未施加任何謂語條件的原始結果集的記錄數。
3、優化器優化模式
3.1 優化器優化模式分類
優化器優化模式分爲Rule、Choose、First rows、All rows
- Rule:就是基於規則Rule的方式
- Choose:當一個表或索引有統計信息,則走CBO的方式,若是表或索引沒統計信息,表又不是特別的小,並且相應的列有索引時,那麼就走索引,走RBO的方式。這是Oracle的默認方式
- First rows:與Choose方式是相似的,所不一樣的是當一個表有統計信息時,它將是以最快的方式返回查詢的最早的幾行,從整體上減小了響應時間。
- All rows:其實就是基於Cost方式
3.2 優化模式使用方法
要修改優化模式能夠使用相似SQL
alter session set optimizer_mode='RULE';
原文出處:https://www.cnblogs.com/mzq123/p/10398701.html