PostgreSQL 原始碼解讀(17)- 查詢語句#2(查詢優化基礎)

husthxd發表於2018-08-14

本文簡單介紹了資料庫系統實現中查詢優化的關係代數基礎,包括優化所基於的關係代數等價規則等.
查詢優化的主要目標是把表示式樹變換成等價的表示式樹,使得在樹中的子表示式生成的關係的平均大小比優化前更小。次要目標是在一個單一查詢中,或在要同時求值多於一個查詢的時候的所有這些查詢中,儘可能形成公共子表示式。

一、等價規則

一個關係表示式可以表示成多種形式,前提是這些形式是等價的。如何把一個表示式變換為其他形式的表示式,遵循哪些關係代數規則,下面作一簡要描述。

1、選擇

冪等性
選擇是冪等性的,也就是說多次執行同一個選擇運算,跟只執行一次效果一樣:
σF(R)=σFσFσF(R)

滿足交換律
σF1σF2(R)=σF2σF1(R)

可分解
σF1∧F2(R)=σF1F2(R))=σF2F1(R))
σF1∨F2(R)=σF1(R)∪σF2(R)

選擇下推
笛卡爾積耗費的資源巨大,在應用笛卡爾積之前最大可能減少兩個關係的大小,把選擇下推至參與運算的關係中。
σF(R × S),假設F可以分解為F1、F2、F3,即σF1σF2σF3,F2只與R有關,F3只與S有關,F1與R和S均有關係,那麼:
σF(R × S)=σF1F2(R) × σF3(S))

選擇和θ連線
σθ(R × S)= R ⋈θ S
這其實是θ連線的定義.
另外,選擇運算在下面兩個條件下對θ連線運算具有分配律:
當選擇條件θ0中的所有屬性只涉及參與連線運算的表示式之一時:
σθ0(R1θ R2) = (σθ0(R1)) ⋈θ R2
當選擇條件θ1只涉及R1的屬性,θ2只涉及R2的屬性時:
σθ1θ2(R1θ R2) =(σθ1(R1)) ⋈θθ2(R2))

選擇和集合運算
選擇在差、交和並運算上均有分配性:
σF(R ∪ S) = σF(R) ∪ σF(S)
σF(R ∩ S) = σF(R) ∩ σF(S)
σF(R - S) = σF(R) - σF(S)

選擇和投影
選擇與投影具有交換性(要求選擇中的列是投影欄位的子集):
πa1,a2,...F(R))=σFa1,a2,...(R))

2、投影

級聯
一系列投影運算中只有最後一個運算是必需的,其他的可省略:
πa1,an,...a1,a2,...a1,a2,...(R)))=πa1,an,...(R)

投影和連線
令L1和L2分別代表R1和R2的屬性,假設連線條件θ只涉及L1∪L2的屬性,則投影在θ連線上具有分配律:
πL1∪L2(R1θ R2) = πL1(R1) ⋈θ πL2(R2)

投影和集合運算
投影在差、交和並運算上均有分配性:
πa1,a2,...(R ∪ S) = πa1,a2,...(R) ∪ πa1,a2,...(S)
πa1,a2,...(R ∩ S) = πa1,a2,...(R) ∩ πa1,a2,...(S)
πa1,a2,...(R - S) = πa1,a2,...(R) - πa1,a2,...(S)

3、連線

θ(自然)連線滿足交換律
R ⋈θ S = S ⋈θ R

θ連線滿足結合律
R1θ1 (R2θ2θ3 R3)=R1θ1θ3 (R2θ2 R3)
其中θ2只涉及R2和R3的屬性.

自然連線滿足結合律
R1 ⋈ (R2 ⋈ R3)=(R1 ⋈ R2) ⋈ R3

4、集合運算

集合並和交滿足交換律
R1 ∪ R2 = R2 ∪ R1
R1 ∩ R2 = R2 ∩ R1

集合並和交滿足結合律
(R1 ∪ R2) ∪ R3 = R1 ∪ (R2 ∪ R3)
(R1 ∩ R2) ∩ R2 = R1 ∩ (R2 ∩ R3)

二、優化原則

儘可能早地執行選擇操作,儘可能在葉子節點完成選擇運算;
儘可能早地執行投影操作,儘可能在葉子節點完成投影運算;
避免笛卡兒積運算,儘可能把笛卡兒積之前和之後的選擇和投影運算合併一起完成。

三、案例研究

現有以下三個關係:
1、單位資訊T_DWXX(以下簡稱DW)

DWMC DWBH DWDZ
X有限公司 1001 廣東省廣州市荔灣區
Y有限公司 1002 北京市海淀區
Z有限公司 1003 廣西南寧市五象區

2、個人資訊T_GRXX(以下簡稱GR)

DWBH GRBH XM NL
1001 901 張三 23
1002 902 李四 33
1002 903 王五 43

3、個人繳費資訊T_JFXX(以下簡稱JF)

GRBH NY JE
901 201801 401.30
901 201802 401.30
901 201803 401.30
902 201801 513.10
902 201802 513.10
902 201804 513.10
903 201801 372.22
903 201804 372.22

現要求列出單位編號為1001和1002的個人編號、姓名和繳費金額.
初始結果表示式為(純粹為了演示需要,把單位資訊加入到連線中,實際並不需要):
πGRBH,XM,JE(DWBH=1001∨DWBH=1002)∧(DW.DWBH=GR.DWBH)∧(GR.GRBH=JF.GRBH)(DW × GR × JF))
轉換為語法樹:

PostgreSQL 原始碼解讀(17)- 查詢語句#2(查詢優化基礎)
初始表示式

DW、GR和JF直接進行笛卡爾積,代價很高,執行選擇下推:
1、選擇下推,把查詢條件下推:
PostgreSQL 原始碼解讀(17)- 查詢語句#2(查詢優化基礎)
選擇下推

2、二次選擇下推,把選擇(連線)下推,右邊樹形成中間結果
PostgreSQL 原始碼解讀(17)- 查詢語句#2(查詢優化基礎)
二次選擇下推

3、投影下推
PostgreSQL 原始碼解讀(17)- 查詢語句#2(查詢優化基礎)
投影下推

通過以上轉換,減少了連線前的元組數量和參與運算的欄位,達到優化目的。

四、小結

1、等價規則:關係代數表示式可以遵循等價規則進行轉換;
2、優化:表示式通過等價規則可以改寫為更優的等價表示式。

五、參考

維基百科
《資料庫系統概念》

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/6906/viewspace-2374899/,如需轉載,請註明出處,否則將追究法律責任。

相關文章