PostgreSQL 原始碼解讀(17)- 查詢語句#2(查詢優化基礎)
本文簡單介紹了資料庫系統實現中查詢優化的關係代數基礎,包括優化所基於的關係代數等價規則等.
查詢優化的主要目標是把表示式樹變換成等價的表示式樹,使得在樹中的子表示式生成的關係的平均大小比優化前更小。次要目標是在一個單一查詢中,或在要同時求值多於一個查詢的時候的所有這些查詢中,儘可能形成公共子表示式。
一、等價規則
一個關係表示式可以表示成多種形式,前提是這些形式是等價的。如何把一個表示式變換為其他形式的表示式,遵循哪些關係代數規則,下面作一簡要描述。
1、選擇
冪等性
選擇是冪等性的,也就是說多次執行同一個選擇運算,跟只執行一次效果一樣:
σF(R)=σFσFσF(R)
滿足交換律
σF1σF2(R)=σF2σF1(R)
可分解
σF1∧F2(R)=σF1(σF2(R))=σF2(σF1(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)=σF1(σF2(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))=σF(πa1,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))
轉換為語法樹:
DW、GR和JF直接進行笛卡爾積,代價很高,執行選擇下推:
1、選擇下推,把查詢條件下推:
2、二次選擇下推,把選擇(連線)下推,右邊樹形成中間結果
3、投影下推
通過以上轉換,減少了連線前的元組數量和參與運算的欄位,達到優化目的。
四、小結
1、等價規則:關係代數表示式可以遵循等價規則進行轉換;
2、優化:表示式通過等價規則可以改寫為更優的等價表示式。
五、參考
維基百科
《資料庫系統概念》
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/6906/viewspace-2374899/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- PostgreSQL 原始碼解讀(32)- 查詢語句#17(查詢優化-表示式預處理#2)SQL原始碼優化
- PostgreSQL 原始碼解讀(29)- 查詢語句#14(查詢優化-上拉子查詢)SQL原始碼優化
- PostgreSQL 原始碼解讀(25)- 查詢語句#10(查詢優化概覽)SQL原始碼優化
- PostgreSQL 原始碼解讀(37)- 查詢語句#22(查詢優化-grouping_plan...SQL原始碼優化
- PostgreSQL 原始碼解讀(27)- 查詢語句#12(查詢優化-上拉子連結#2)SQL原始碼優化
- PostgreSQL 原始碼解讀(36)- 查詢語句#21(查詢優化-消除外連線)SQL原始碼優化
- PostgreSQL 原始碼解讀(35)- 查詢語句#20(查詢優化-簡化Having和Grou...SQL原始碼優化
- PostgreSQL 原始碼解讀(24)- 查詢語句#9(查詢重寫)SQL原始碼
- PostgreSQL 原始碼解讀(30)- 查詢語句#15(查詢優化-扁平化處理UNION ALL)SQL原始碼優化
- PostgreSQL 原始碼解讀(28)- 查詢語句#13(查詢優化-上拉子連結#3)SQL原始碼優化
- PostgreSQL 原始碼解讀(26)- 查詢語句#11(查詢優化-上拉子連結#1)SQL原始碼優化
- PostgreSQL 原始碼解讀(31)- 查詢語句#16(查詢優化-表示式預處理#1)SQL原始碼優化
- PostgreSQL 原始碼解讀(33)- 查詢語句#18(查詢優化-表示式預處理#3)SQL原始碼優化
- PostgreSQL 原始碼解讀(34)- 查詢語句#19(查詢優化-表示式預處理#4)SQL原始碼優化
- PostgreSQL 原始碼解讀(20)- 查詢語句#5(查詢樹Query詳解)SQL原始碼
- PostgreSQL 原始碼解讀(16)- 查詢語句#1(基礎:關係代數)SQL原始碼
- PostgreSQL 原始碼解讀(89)- 查詢語句#74(SeqNext函式#2)SQL原始碼函式
- PostgreSQL 原始碼解讀(91)- 查詢語句#76(ExecHashJoin函式#2)SQL原始碼函式
- PostgreSQL 原始碼解讀(51)- 查詢語句#36(Optimizer Review#2)SQL原始碼View
- PostgreSQL 原始碼解讀(18)- 查詢語句#3(SQL Parse)SQL原始碼
- PostgreSQL 原始碼解讀(19)- 查詢語句#4(ParseTree詳解)SQL原始碼
- PostgreSQL 原始碼解讀(83)- 查詢語句#68(PortalStart函式)SQL原始碼函式
- PostgreSQL 原始碼解讀(75)- 查詢語句#60(Review - standard_...SQL原始碼View
- PostgreSQL 原始碼解讀(74)- 查詢語句#59(Review - subquery_...SQL原始碼View
- PostgreSQL 原始碼解讀(42)- 查詢語句#27(等價類)SQL原始碼
- PostgreSQL 原始碼解讀(39)- 查詢語句#24(query_planner函式#2)SQL原始碼函式
- PostgreSQL 原始碼解讀(67)- 查詢語句#52(make_one_rel函式#17-...SQL原始碼函式
- PostgreSQL 原始碼解讀(82)- 查詢語句#67(PortalXXX系列函式)SQL原始碼函式
- PostgreSQL 原始碼解讀(81)- 查詢語句#66(Review - exec_simp...SQL原始碼View
- PostgreSQL 原始碼解讀(90)- 查詢語句#75(ExecHashJoin函式#1)SQL原始碼函式
- PostgreSQL 原始碼解讀(88)- 查詢語句#73(SeqNext函式#1)SQL原始碼函式
- PostgreSQL 原始碼解讀(87)- 查詢語句#72(PortalRunSelect->E...SQL原始碼
- PostgreSQL 原始碼解讀(84)- 查詢語句#69(PortalStart->InitP...SQL原始碼
- PostgreSQL 原始碼解讀(85)- 查詢語句#70(PortalRun->InitPla...SQL原始碼
- PostgreSQL 原始碼解讀(86)- 查詢語句#71(PortalRun->PortalR...SQL原始碼
- PostgreSQL 原始碼解讀(93)- 查詢語句#77(ExecHashJoin函式#3)SQL原始碼函式
- PostgreSQL 原始碼解讀(50)- 查詢語句#35(Optimizer Review#1)SQL原始碼View
- PostgreSQL 原始碼解讀(73)- 查詢語句#58(grouping_planner函式...SQL原始碼函式