(数据库系统概论|王珊)第九章关系查询处理和关系优化-第三节:查询优化之代数优化
注意:
- 關系代數有關符號,大家可能又不熟悉了,點擊跳轉:(數據庫系統概論|王珊)第二章關系數據庫-第四節:關系代數
文章目錄
- 一:關系代數表達式等價變換規則
- (1)連接、笛卡爾積、并、交的交換律
- (2)連接、笛卡爾積、并、交的結合律
- (3)投影的串接定律
- (4)選擇的串接定律
- (5)選擇與投影的交換律
- (6)選擇與笛卡爾積的交換律
- (7)選擇與并的分配律
- (8)選擇與差運算的分配律
- (9)選擇對自然連接的分配律
- (10)投影與笛卡爾積的分配律
- (11)投影與并的分配律
- 二:查詢樹的啟發式優化
- (1)典型的啟發式規則
- (2)實現算法
- (3)實例演示
在(數據庫系統概論|王珊)第九章關系查詢處理和關系優化-第一節:查詢處理中講到過:SQL語句經過查詢分析,查詢檢查后變換為查詢樹,它是關系代數表達式的內部表示。本節介紹查詢優化之代數優化,它是基于關系代數等價變換規則的優化方法
- 兩個關系表達式R1R_{1}R1?和R2R_{2}R2?是等價的,可以記為R1≡R2R_{1} \equiv R_{2}R1?≡R2?
一:關系代數表達式等價變換規則
- 為了能方便閱讀,就沒用截圖。手都麻了🤮(動動手點個贊吧🥳)
(1)連接、笛卡爾積、并、交的交換律
笛卡爾積
R×S≡S×RR×S \equiv S×RR×S≡S×R
并
R∪S≡S∪RR \cup S \equiv S \cup RR∪S≡S∪R
交
R∩S≡S∩RR \cap S \equiv S \cap RR∩S≡S∩R
連接
R?FS≡S?FR、R?S≡S?RR \underset{F}{\bowtie} S \equiv S \underset{F}{\bowtie} R 、 R\bowtie S \equiv S\bowtie RRF??S≡SF??R、R?S≡S?R
(2)連接、笛卡爾積、并、交的結合律
笛卡爾積
(R×S)×T≡R×(S×T)(R×S) ×T\equiv R×(S×T)(R×S)×T≡R×(S×T)
并
(R∪S)∪T≡R∪(S∪T)(R \cup S)\cup T \equiv R \cup (S\cup T)(R∪S)∪T≡R∪(S∪T)
交
(R∩S)∩T≡R∩(S∩T)(R \cap S)\cap T \equiv R \cap (S\cap T)(R∩S)∩T≡R∩(S∩T)
連接
(R?FS)?FT≡R?F(S?FT)(R \underset{F}{\bowtie} S) \underset{F}{\bowtie} T \equiv R \underset{F}{\bowtie} (S \underset{F}{\bowtie} T) (RF??S)F??T≡RF??(SF??T)
(R?S)?T≡R?(S?T)(R\bowtie S) \bowtie T \equiv R\bowtie (S \bowtie T)(R?S)?T≡R?(S?T)
(3)投影的串接定律
關系的兩次投影操作可以合并為一次完成(反過來就是分解)
ΠA1,A2,...,An(ΠB1,B2,...,Bm(E))≡ΠA1,A2,...,An(E)\Pi_{A_{1},A_{2},...,A_{n}}(\Pi_{B_{1},B_{2},...,B_{m}}(E)) \equiv \Pi_{A_{1},A_{2},...,A_{n}}(E)ΠA1?,A2?,...,An??(ΠB1?,B2?,...,Bm??(E))≡ΠA1?,A2?,...,An??(E)
- EEE是關系代數表達式
- Ai(i=1,2,..,n),Bj(j=1,2,..,m)A_{i}(i=1,2,..,n),B_{j}(j=1,2,..,m)Ai?(i=1,2,..,n),Bj?(j=1,2,..,m)是屬性名。并且{A1,A2,...,An}\{ {A_{1},A_{2},...,A_{n}} \}{A1?,A2?,...,An?}構成{B1,B2,...,Bm}\{ {B_{1},B_{2},...,B_{m}} \}{B1?,B2?,...,Bm?}的子集
(4)選擇的串接定律
選擇的兩次投影操作可以合并為一次完成(反過來就是分解)
σF1(σF2(E))≡σF1∧F2(E)\sigma_{F1}(\sigma_{F2}(E)) \equiv \sigma_{F1\land F2}(E)σF1?(σF2?(E))≡σF1∧F2?(E)
(5)選擇與投影的交換律
σF(ΠA1,A2,...,An(E))≡ΠA1,A2,...,An(σF(E))\sigma_{F}(\Pi_{A_{1},A_{2},...,A_{n}}(E)) \equiv \Pi_{A_{1},A_{2},...,A_{n}}(\sigma_{F}(E))σF?(ΠA1?,A2?,...,An??(E))≡ΠA1?,A2?,...,An??(σF?(E))
- 假設:選擇條件FFF只涉及屬性A1,A2,...,An{A_{1},A_{2},...,A_{n}}A1?,A2?,...,An?
ΠA1,A2,...,An(σF(E))≡ΠA1,A2,...,An(σF(ΠA1,A2,...,An,B1,B2,...,Bm(E)))\Pi_{A_{1},A_{2},...,A_{n}}(\sigma_{F}(E)) \equiv \Pi_{A_{1},A_{2},...,A_{n}}(\sigma_{F}( \Pi_{A_{1},A_{2},...,A_{n},B_{1},B_{2},...,B_{m}}(E)))ΠA1?,A2?,...,An??(σF?(E))≡ΠA1?,A2?,...,An??(σF?(ΠA1?,A2?,...,An?,B1?,B2?,...,Bm??(E)))
- 假設:FFF中有不屬于A1,A2,...,An{A_{1},A_{2},...,A_{n}}A1?,A2?,...,An?的屬性B1,B2,...,Bm{B_{1},B_{2},...,B_{m}}B1?,B2?,...,Bm?
(6)選擇與笛卡爾積的交換律
對于σF(E1×E2)\sigma_{F}(E_{1}×E_{2})σF?(E1?×E2?),有如下等價
①
σF(E1×E2)≡σF(E1)×E2\sigma_{F}(E_{1}×E_{2}) \equiv \sigma_{F}(E_{1})×E_{2}σF?(E1?×E2?)≡σF?(E1?)×E2?
- 假設:選擇條件只與其中的一個關系有關,應該對那個關系先做選擇,然后再做笛卡爾積。例如上面FFF中涉及的屬性都是E1E_{1}E1?中的屬性
②
σF(E1×E2)≡σF1(E1)×σF2(E2)\sigma_{F}(E_{1}×E_{2}) \equiv \sigma_{F_{1}}(E_{1})×\sigma_{F_{2}}(E_{2})σF?(E1?×E2?)≡σF1??(E1?)×σF2??(E2?)
- 假設:選擇條件與兩個關系都有關,應該先分別做選擇,然后再做笛卡爾積。例如上面F=F1∧F2F=F_{1} \land F_{2}F=F1?∧F2?,并且F1F_{1}F1?中只涉及E1E_{1}E1?中的屬性,F2F_{2}F2?中只涉及E2E_{2}E2?中的屬性
③
σF(E1×E2)≡σF2(σF1(E1)×E2)\sigma_{F}(E_{1}×E_{2}) \equiv \sigma_{F_{2}}(\sigma_{F_{1}}(E_{1})×E_{2})σF?(E1?×E2?)≡σF2??(σF1??(E1?)×E2?)
- 假設:如果選擇條件與某一部分關系有關,那么也應該先對那個關系做部分選擇,然后做笛卡爾積,最后做選擇。例如上面F=F1∧F2F=F_{1} \land F_{2}F=F1?∧F2?,并且F1F_{1}F1?中只涉及E1E_{1}E1?中的屬性,F2F_{2}F2?中涉及E1E_{1}E1?和E2E_{2}E2?中的屬性
(7)選擇與并的分配律
σ(E1∪E2)≡σF(E1)∪σF(E2)\sigma(E_{1} \cup E_{2}) \equiv \sigma_{F}(E_{1}) \cup \sigma_{F}(E_{2})σ(E1?∪E2?)≡σF?(E1?)∪σF?(E2?)
- 假設:E=E1∪E2E=E_{1} \cup E_{2}E=E1?∪E2?,E1E_{1}E1?和E2E_{2}E2?有相同的屬性名
(8)選擇與差運算的分配律
σ(E1?E2)≡σF(E1)?σF(E2)\sigma(E_{1} - E_{2}) \equiv \sigma_{F}(E_{1}) - \sigma_{F}(E_{2})σ(E1??E2?)≡σF?(E1?)?σF?(E2?)
(9)選擇對自然連接的分配律
σF(E1?E2)≡σF(E1)?σF(E2)\sigma_{F}(E_{1} \bowtie E_{2}) \equiv \sigma_{F}(E_{1}) \bowtie \sigma_{F}(E_{2})σF?(E1??E2?)≡σF?(E1?)?σF?(E2?)
- FFF只涉及E1E_{1}E1?和E2E_{2}E2?的公共屬性
(10)投影與笛卡爾積的分配律
ΠA1,A2,...,An,B1,B2,...,Bm(E1×E2)≡ΠA1,A2,...,An(E1)×ΠB1,B2,...,Bm(E2)\Pi_{A_{1},A_{2},...,A_{n},B_{1},B_{2},...,B_{m}}(E_{1}×E_{2}) \equiv \Pi_{A_{1},A_{2},...,A_{n}}(E_{1}) × \Pi_{B_{1},B_{2},...,B_{m}}(E_{2})ΠA1?,A2?,...,An?,B1?,B2?,...,Bm??(E1?×E2?)≡ΠA1?,A2?,...,An??(E1?)×ΠB1?,B2?,...,Bm??(E2?)
- A1,A2,...,AnA_{1},A_{2},...,A_{n}A1?,A2?,...,An?是E1E_{1}E1?的屬性
- B1,B2,...,BmB_{1},B_{2},...,B_{m}B1?,B2?,...,Bm?是E2E_{2}E2?的屬性
(11)投影與并的分配律
ΠA1,A2,...,An(E1∪E2)≡ΠA1,A2,...,An(E1)∪ΠA1,A2,...,An(E2)\Pi_{A_{1},A_{2},...,A_{n}}(E_{1} \cup E_{2}) \equiv \Pi_{A_{1},A_{2},...,A_{n}}(E_{1}) \cup \Pi_{A_{1},A_{2},...,A_{n}}(E_{2})ΠA1?,A2?,...,An??(E1?∪E2?)≡ΠA1?,A2?,...,An??(E1?)∪ΠA1?,A2?,...,An??(E2?)
二:查詢樹的啟發式優化
- 這是對關系代數表示的查詢樹進行優化的方法
(1)典型的啟發式規則
典型的啟發式規則
- 【規則1】選擇運算應盡可能先做:這是為了減少中間結果的規模
- 【規則2】投影和選擇運算同時進行:這是為了避免重復掃描
- 【規則3】將投影運算與其前后的雙目運算結合起來:這是為了避免重復掃描
- 【規則4】把某些選擇運算和其前面的笛卡爾積結合起來成為一個連接運算:這是為了減少中間結果的規模
- 【規則5】提取公共子表達式(公因子):這是為了保存計算結果,避免重復計算
(2)實現算法
- 該算在遵循啟發式規則,并應用關系代數表達式等價變換規則來優化關系表達式
- 該算法的輸入和輸出都是查詢樹(分別對應待優化和優化的關系表達式)
算法步驟
- 【步驟1】分解選擇運算:這是為了便于不同的選擇運算沿樹的不同分枝向樹葉移動,一直移動到與這個選擇條件相關的關系處,使選擇盡可能先做。σF1∧F2∧...∧Fn(E)?σF1(σF2(...(σFn(E))...))\sigma_{F_{1} \land F_{2} \land ... \land F_{n}} (E)\Rightarrow \sigma_{F_{1}}(\sigma_{F_{2}}(...(\sigma_{F_{n}}(E))...))σF1?∧F2?∧...∧Fn??(E)?σF1??(σF2??(...(σFn??(E))...))
- 【步驟2】通過交換選擇運算,將每個選擇運算盡可能移動到葉端:利用規則4~9盡可能把選擇移動到樹的葉端
- 【步驟3】通過交換投影運算,將每個投影運算盡可能移動到葉端:利用規則3、11、10、5盡可能把投影移動到樹的葉端
- 【步驟4】合并選擇和投影的串接:利用規則3~5把選擇和投影的串接合并成單個選擇、單個投影或一個選擇后面跟一個投影。這是為了使多個選擇或投影能同時進行,或在一次掃描中全部完成
- 【步驟5】對內結點分組:每一雙目運算(×××、?\bowtie?、∪\cup∪、?-?)和它所有的直接祖先的一元運算結點(σ\sigmaσ或Π\PiΠ)分為一組(如果其后代直到葉子全是單目運算,則也將他們并入該組);注意當雙目運算是笛卡爾積(×××),而且其后的選擇不能與它結合為等值連接時,則不能將選擇與這個×××并為一組
(3)實例演示
- 注意這是一個很重要的考點
【例】如下給出了一個SQL語句
SELECT Student.Sname FROM Student,SC WHERE Student.Sno=SC.Sno AND SC.Sno='2';將SQL語句轉為關系代數表達式
- 先對Student和SC做笛卡爾積
- 再對中間結果做選擇(條件為 Student.Sno=SC.Sno)
- 再對中間結果做選擇(條件為SC.Sno='2')
- 最后投影
結果為
ΠSname(σStudent.Sno=sc.Cno∧sc.cno=2(student×sc))\Pi_{Sname}(\sigma_{Student.Sno=sc.Cno \land sc.cno=2}(student × sc))ΠSname?(σStudent.Sno=sc.Cno∧sc.cno=2?(student×sc))
將關系代數表達式轉為查詢樹
查詢樹優化
①首先選擇條件盡可能下移:
- SC.Sno='2'只和SC有關,所以它會沿著分支恰當的分支下移到SC的上方
- Student.Sno=SC.Sno同時涉及Student和SC,所以只能待在那里
②:把選擇和其之前的笛卡爾積合并為等值連接,或者干脆變為自然連接
【例】查詢選修了數據庫課程的女生學號與姓名,如下是SQL語句
SELECT Student.Sno,Sname FROM Student,SC,Course WHERE Cname='datebase' AND Ssex='女';將SQL語句轉為關系代數表達式
ΠSno,Sname(σCname=′數據庫′∧Ssex=′女′(SC?Course?Student))\Pi_{Sno,Sname}(\sigma_{Cname='數據庫' \land Ssex='女'}(SC \bowtie Course \bowtie Student))ΠSno,Sname?(σCname=′數據庫′∧Ssex=′女′?(SC?Course?Student))
將關系代數表達式轉為查詢樹
查詢樹優化
①:選擇條件復雜,先分解選擇條件
②:將選擇運算盡可能移動到樹的葉端
③:涉及了投影運算,所以也把它盡可能移動到樹的葉端
- 投影運算下移時要保留連接屬性
④:對內結點進行分組
總結
以上是生活随笔為你收集整理的(数据库系统概论|王珊)第九章关系查询处理和关系优化-第三节:查询优化之代数优化的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: nyoj--891--找点(贪心)
- 下一篇: (数据库系统概论|王珊)第七章数据库设计