Oracle SQL優化器簡介


在看《基於Oracle的SQL優化一書》知道了很多專業名稱,做了記錄,CBO、優化器、查詢轉換、執行計划、Hint、並行、游標、綁定變量、統計信息、直方圖、索引等等。這篇博客可以說是讀書筆記

一、Oracle的優化器

1.1 優化器簡介

優化器(Optimizer):優化器是Oracle數據庫內置的一個核心子系統,負責解析SQL,Oracle優化器是Oracle系統的一個核心組件,其目的是按照一定的原則來獲取目標SQL在當前情形下執行的最高效執行路徑,也可以說是執行計划。

1.2 SQL執行過程

Oracle SQL的執行過程:

在這里插入圖片描述

二、優化器優化方式

2.1 優化器的優化方式

Oracle優化器按照優化方式分為兩種

  • 基於規則的優化器(Rule-Based Optimizer),簡稱RBO
  • 基於成本的優化器(Cost-Based Optimizer),簡稱CBO

2.2 基於規則的優化器

2.2.1 RBO簡介

基於規則的優化器(Rule-Based Optimizer):所謂基於規則的優化器是指Oracle按照硬編碼在數據庫的一系列規則來決定SQL的執行計划,簡稱是RBO

2.2.2 RBO缺陷

RBO在oracle10后官方就不建議用,因為RBO並不支持oracle一些性能比較好的功能特性,也不會根據表的數據量等等獲取執行計划,而且RBO定的那些規則也不是很容易修改。不過代碼在oracle10后版本還是保存的,所以要學習測試也可以用SQL開啟RBO模式

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.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';


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM