資料庫物理優化:啟發式規則與代價模型驅動的存取路徑選擇
代數優化只調整操作次序,物理優化需從**多條存取路徑**中選擇代價最低者。核心依據:啟發式規則 (RBO) 與 代價估算 (CBO)。
一、選擇操作啟發式規則
| 場景 | 規則 |
| 小關係 | 全表掃描 |
| 大關係 + 主鍵=值 | 主鍵索引 (唯一,≤1 行) |
| 大關係 + 非主屬性=值 + 有索引 | 選擇率 <10% → 索引掃描;否則全表掃描 |
| 大關係 + 非等值/範圍 + 有索引 | 選擇率 <10% → 索引掃描;否則全表掃描 |
| AND 合取條件 | 有組合索引優先;單列索引可用索引合併;否則全表 |
| OR 析取條件 | 通常全表掃描 |
二、連接操作啟發式規則
- 兩表已按連接屬性排序 → **排序-合併**。
- 一表有連接屬性索引 → **索引連接**。
- 以上皆無,一表較小 → **Hash Join**。
- 退而求其次 → **嵌套循環**,**小表作外層** (塊數少者),代價
Br + (Br/(K-1))*Bs。
三、CBO 統計信息 (數據字典)
- 表:元組數
N、長度 l、塊數 B、溢出塊 BO。
- 列:不同值數
m、選擇率 f (均勻則 1/m)、最大/最小值、是否有索引、索引類型。
- 索引 (B+樹):層數
L、不同鍵值數、選擇基數 S、葉節點數 Y。
四、代價估算公式速查
| 算法 | 代價公式 |
| 全表掃描 | cost = B (碼=值 平均 B/2) |
| B+樹索引 (碼=值) | cost = L + 1 |
| B+樹索引 (非碼=值, 選擇基數 S) | 最壞 cost = L + S |
| B+樹索引 (範圍 >/>=/ | cost = L + Y/2 + B/2 |
| 嵌套循環連接 | cost = Br + (Br/(K-1))*Bs (+ 寫回結果塊數) |
| 排序-合併連接 (已排序) | cost = Br + Bs + 結果塊數 |
| 排序-合併連接 (需排序) | + (2*B)*(1+log2B) 排序代價 |
五、實戰建議
- 複雜查詢**不要全依賴優化器**,需理解 RBO/CBO 規律,編寫友好 SQL。
- 學會讀
EXPLAIN PLAN,分析實際執行策略。
- 統計信息定期
ANALYZE/DBMS_STATS 更新,避免 CBO 誤判。