目錄
第十三章 查詢優化
13.1 概述
查詢優化(query optimization)就是從許多策略中找出能最有效的查詢執行計劃的一種處理過程。
查詢優化器產生查詢計劃的步驟:
- 產生邏輯上與給定表達式等價的表達式
- 對產生的表達式以不同的方式做註釋
- 估計每個執行計劃的代價,選擇估計代價最小的一個
查看查詢執行計劃:
- Oracle:
- 生成查詢計劃,並將計劃存儲在plan_table中: explain for <sql>;
- 查詢生成的查詢計劃:select * from table(dbms_xplan.display);
- postgreSQL: explain for <sql>
13.2 關係表達式的轉換
等價的表達式(equivalent):如果兩個關係表達式在每一個有效的數據庫實例中都會產生相同的結果集。
13.2.1 等價規則
等價規則(equivalence rule)指出了兩種不同形式的表達式是等價的。
13.2.2 轉換的例子
若一組等價規則中,任意一條規則都不能由其他規則聯合起來導出,稱這組等價規則集爲最小的(minimal)等價規則集。
舉例:等價規則的用法
13.2.3 連接的次序
一個好的連接次序 對於 減少臨時結果的大小是很重要的。
例如:
13.2.4 等價表達式的枚舉
可以用枚舉的方式產生所有的等價表達式,如下圖所示。這種方式在時間上和空間上的代價都很大。可以採用兩種關鍵思想,優化器可以極大地減少時間和空間上的開銷:
13.3 表達式結果集統計大小的估計
本節首先介紹一些有關存儲在數據庫目錄中的有關數據庫關係的統計信息;
然後指出如何利用這些統計信息估計不同關係操作運算結果的統計信息。
13.3.1 目錄信息
數據庫目錄存儲了有關數據庫關係的下列統計信息:
13.3.2 選擇運算結果大小的估計
13.3.3 連接結果與運算大小的估計
13.3.4 其他運算的結果集大小的估計
13.3.5 不同取值個數的估計
13.4 執行計劃選擇
基於代價的優化器(cost-based optimizer)從給定查詢等價的所有查詢執行計劃空間中進行搜索,選擇估計代價最小的一個。
13.4.1 基於代價的連接順序選擇
13.4.2 採用等價規則的基於代價的優化器
優化器可以採用的算法:
- 聯繫順序選擇算法:可以處理最常見的查詢,並執行內連接操作。然而它無法解決如聚集、外連接、嵌套查詢的操作。
- 基於代價的連接順序選擇算法:處理只有連接和選擇的子表達式
- 啓發式轉化的方法:處理連接以外的結構
採用等價規則的基於代價的通用優化器(可以處理各種查詢結構)
- 優點:採用等價規則可以使它易於擴展新的規則到優化器來處理不同的查詢結構。例如:使用擴展的關係代數結構表達嵌套查詢
- 產生所以有的可能的執行計劃的過程:
- 添加一類新的稱爲物理等價(physical equivalence rule )的等價規則,允許將例如連接這樣的邏輯操作轉爲散列連接或嵌套循環連接這樣的屋裏操作。
- 通過將這類規則加入到原來的等價規則(13.2.4節的算法)中,程序可以產生所有的可能的執行計劃
- 利用基於代價的估計技術選擇最優計劃
- 如何使得上述算法更高效?
13.4.3 啓發式優化
基於代價優化的一個缺點是優化本身的代價。
啓發式(heuristics)優化:利用一些規則來進行查詢,例如:
- 儘早的執行選擇運算
- 儘早的執行投影原酸(通常選擇運算優於投影運算執行比較好)
注意:基於規則的啓發式優化不一定總會帶來高效的查詢。
多數現實的查詢優化器採取更多的啓發式規則來減少優化的代價。例如:
- System R優化器:僅考慮右操作對象是原始關係r1,r2,...,rn之一的那些連接順序,這種連接順序稱爲左深連接順序(left-deep join order)
- 考慮全體左深連接順序的時間代價是:O(n!)
- 利用動態規劃,可以實現在近似O(n2^n)找到最佳連接順序
- 某些版本的Oracle系統採用 一種 基於減少連接順序選擇代價的啓發式優化算法。
- 對於一個n路連接,考慮n個評估計劃
- 每個計劃使用一個左深連接順序,各個計劃從一個不同的關係開始進行
- 通過基於可用的存取路徑的排序反覆選擇參加下一個連接的“最佳”關係,啓發式方法分爲n個執行計劃構造連接順序。
- 基於可用的存取路徑,每一個連接可選擇:嵌套循環鏈接算法、或排序歸併連接算法。
- 最後,基於是在內層關係上沒有索引的嵌套循環連接個數最小,以及使得排序歸併連接的個數最小的原則,用啓發式方法從n個執行計劃中選一個
許多優化器允許爲查詢優化制定一個成本預算。
- 當超過優化成本預算(optimization cost budget)時停止搜索最優計劃,返回當前找到的最優計劃。
- 可以動態設置這個成本預算
優化器通常用低成本的一種啓發式的規則找到以計劃,然後在這個計劃的基礎上進行完整的基於代價的優化。
可以利用計劃緩存(plan cashing)的方式緩存和重用查詢計劃。
13.4.4 嵌套子查詢的與優化
複雜的嵌套子查詢的優化非常困哪,許多優化器僅做少量的去除相關的工作。只要有可能,要儘量避免使用複雜嵌套子查詢,因爲不能保證優化器是否能將它們轉換成一種能夠有效運算的形式。
相關執行(correlated evaluation):
效率不高,對外層關係的每個元組都要進行單獨的運算,導致大量的磁盤I/O。
例如:
13.5 物化視圖
普通的視圖:數據庫只存儲定義該視圖的查詢語句
物化視圖(materialized view):計算了內容並存儲的視圖。可以用來提高性能。
13.5.1 視圖維護
視圖維護(view maintainance): 保持物化視圖和原始數據同步更新的任務稱作視圖維護。可採取的方式包括:
- 採用人工書寫代碼的方式
- 對視圖定義中每個關係的插入、刪除和更新定義觸發器
- 增量的視圖維護(incremental view maintenance): 只對物化視圖受影響的部分進行修改。不需要定義觸發器,數據庫系統會自動的進行增量的視圖維護。
- 即時的視圖維護(immediate view maintenance):更新發生時,增量的視圖維護作爲更新事務的一部分立即執行
- 延遲的視圖維護(deferred view maintenance):視圖維護延遲到更晚一些執行,減少更新事務的開銷。
13.5.2 增量的視圖維護
插入、刪除、更新(可以先刪除,再插入來實現)
13.5.2.1 選擇和投影操作
13.5.2.2 選擇和投影操作
13.5.2.3 聚集操作
13.5.2.4 其他操作
13.5.2.5 表達式的處理
13.5.3 查詢優化和物化視圖
13.5.4 物化視圖和索引選擇
物化視圖的選擇標準:選擇的物化視圖集應該能夠是的系統完成查詢和更新的工作負載所耗費的總執行時間(包括維護物化視圖所用的時間)最短。
13.6 查詢優化中的高級視圖
13.6.1 top-K優化
查詢在某些屬性排序後的結果中的前K項。
當K值很小時,如果一個查詢優化計劃先產生整個結果集,再排序產生K個結果,這種方法效率很低。
解決方法:
- 使用能夠產生有序的結果的流水線查詢計劃
- 估計將會出現在前K個輸出中的排序屬性的最大值,然後引入選擇謂詞刪除較大的值
13.6.2 連接極小化
13.6.3 更新的優化
13.6.4 多查詢優化和共享式掃描
13.6.5 參數化查詢優化
總結