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