優化器
2 種優化方式
CBO 優於 RBO
,是因爲 RBO 是一種呆板、過時的優化器,它只認規則,對數據不敏感。畢竟規則是死的,數據是變化的。
優化方式 | 全稱 | 描述 |
---|---|---|
RBO | Rule-Based Optimization 基於規則的優化器 |
自 Oracle 6 以來被採用,一直沿用至 Oracle 9i,Oracle 10g 開始被棄用。 它有一套嚴格的使用規則:只要你按照它去寫SQL語句,無論數據表中的內容怎麼樣,也不會影響到你的 “執行計劃” |
CBO | Cost-Based Optimization 基於代價的優化器 |
自 Oracle 8 中開始引入,但到 Oracle 9i 中才逐漸成熟,在 Oracle 10g 中完全取代 RBO CBO 是計算各種可能的 “執行計劃” 的 “代價(cost)”,從中選用 cost 最低的方案,作爲實際運行方案 |
4 種優化模式
- 優化器模式包括:選擇、規則、第一行、所有行
優化模式 | 解釋 |
---|---|
Choolse | 默認(重點關注) 當一個表或索引有統計信息時,走 CBO 模式,反之走 RBO 模式 |
Rule | 基於規則的方法,可忽略 |
First Rows | 與 Choose 方式類似,當一個表有統計信息時,它將以最快的方式返回查詢的最先的幾行,從總體上減少了相應的時間,反之走 RBO 模式 |
All Rows | 同 First Rows,當一個表有統計信息時,以最快的方式返回表的所有行,從總體上提高查詢的吞吐量,反之走 RBO 模式 |
表連接 / 訪問方式
表的訪問方式 | 解釋 |
---|---|
table access full(全表掃描) | |
table access by rowid(通過 rowid 掃描) | |
table access by index scan(索引掃描) | index unique scan(索引唯一掃描) index range scan(索引範圍掃描) index full scan(索引全掃描). index fast full scan(索引快速掃描) index skip scan(索引跳躍掃描) |
表連接方式 | 工作原理 | 適用原則 |
---|---|---|
nested loops 嵌套循環 | 2層嵌套循環 | 1.驅動表數據量 < 1W 2.被查找表有索引 |
hash join 散列連接 | 較小的表在 RAM 創建 hash table,較大的表讀取記錄,效率最高 | 1.等值連接 2. 驅動表大時,效果較好;驅動表小時,效果更好 3. 需要設置參數 HASH_AREA_SIZE |
sort merge join 排序合併連接 | 記錄排序然後合併 | 1. 非等值連接或排序 |
star join 星型連接 | 多個維度表 和一個大的 數據表,然後嵌套循環連接 | 1.一般用於 數據倉庫 2. 需要啓用參數 STAR_TRANSFORMATION_ENABLED |
F5 查看執行計劃
- 工具:PL/SQL
- 設置:
工具 -> 首選項 -> 窗口類型 -> 計劃窗口
列字段 | 解釋 |
---|---|
對象所有者(Object owner) | 屬主 |
對象名稱(Object name) | 對象名(表名、索引名等) |
耗費(Cost) | Oracle 估計的該步驟的執行成本,理論上越小越好 |
基數(Cardinality) | Oracle 估計的當前操作的返回結果集行數 |
字節(Bytes) | 執行該步驟後返回的字節數 |
訪問謂詞(Access predicates) | 知道要什麼數據,也知道在哪裏,直接去取 一般有索引 |
過濾謂詞(Filter predicates) | 先把數據取出來,再判斷是否滿足條件,不滿足就丟棄 一般沒有索引 |