第九章关系查询处理和关系优化-第三节:查询优化之代数优化

注意:

(数据库系统概论|王珊)第九章关系查询处理和关系优化-第一节:查询处理中讲到过:SQL语句经过查询分析,查询检查后变换为查询树,它是关系代数表达式的内部表示。本节介绍查询优化之代数优化,它是基于关系代数等价变换规则的优化方法

  • 两个关系表达式R1R_{1}R2R_{2}是等价的,可以记为R1R2R_{1} \equiv R_{2}

一:关系代数表达式等价变换规则

  • 为了能方便阅读,就没用截图。手都麻了🤮(动动手点个赞吧🥳) 在这里插入图片描述

(1)连接、笛卡尔积、并、交的交换律

笛卡尔积

R×SS×RR×S \equiv S×R

RSSRR \cup S \equiv S \cup R

RSSRR \cap S \equiv S \cap R

连接

R\bowtie S \equiv S\bowtie R$$ ## (2)连接、笛卡尔积、并、交的结合律 **笛卡尔积** $$(R×S) ×T\equiv R×(S×T)$$ **并** $$(R \cup S)\cup T \equiv R \cup (S\cup T)$$ **交** $$(R \cap S)\cap T \equiv R \cap (S\cap T)$$ **连接** $$(R \underset{F}{\bowtie} S) \underset{F}{\bowtie} T \equiv R \underset{F}{\bowtie} (S \underset{F}{\bowtie} T) $$ $$(R\bowtie S) \bowtie T \equiv R\bowtie (S \bowtie T)$$ ## (3)投影的串接定律 **关系的两次投影操作可以合并为一次完成(反过来就是分解)** $$\Pi_{A_{1},A_{2},...,A_{n}}(\Pi_{B_{1},B_{2},...,B_{m}}(E)) \equiv \Pi_{A_{1},A_{2},...,A_{n}}(E)$$ - $E$是关系代数表达式 - $A_{i}(i=1,2,..,n),B_{j}(j=1,2,..,m)$是属性名。并且$\{ {A_{1},A_{2},...,A_{n}} \}$构成$\{ {B_{1},B_{2},...,B_{m}} \}$的子集 ## (4)选择的串接定律 **选择的两次投影操作可以合并为一次完成(反过来就是分解)** $$\sigma_{F1}(\sigma_{F2}(E)) \equiv \sigma_{F1\land F2}(E)$$ ## (5)选择与投影的交换律 $$\sigma_{F}(\Pi_{A_{1},A_{2},...,A_{n}}(E)) \equiv \Pi_{A_{1},A_{2},...,A_{n}}(\sigma_{F}(E))$$ - **假设**:选择条件$F$只涉及属性${A_{1},A_{2},...,A_{n}}$ $$\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)))$$ - **假设**:$F$中有不属于${A_{1},A_{2},...,A_{n}}$的属性${B_{1},B_{2},...,B_{m}}$ ## (6)选择与笛卡尔积的交换律 对于$\sigma_{F}(E_{1}×E_{2})$,有如下等价 ① $$\sigma_{F}(E_{1}×E_{2}) \equiv \sigma_{F}(E_{1})×E_{2}$$ - **假设**:**选择条件只与其中的一个关系有关,应该对那个关系先做选择,然后再做笛卡尔积**。例如上面$F$中涉及的属性都是$E_{1}$中的属性 ② $$\sigma_{F}(E_{1}×E_{2}) \equiv \sigma_{F_{1}}(E_{1})×\sigma_{F_{2}}(E_{2})$$ - **假设**:**选择条件与两个关系都有关,应该先分别做选择,然后再做笛卡尔积**。例如上面$F=F_{1} \land F_{2}$,并且$F_{1}$中只涉及$E_{1}$中的属性,$F_{2}$中只涉及$E_{2}$中的属性 ③ $$\sigma_{F}(E_{1}×E_{2}) \equiv \sigma_{F_{2}}(\sigma_{F_{1}}(E_{1})×E_{2})$$ - **假设:如果选择条件与某一部分关系有关,那么也应该先对那个关系做部分选择,然后做笛卡尔积,最后做选择**。例如上面$F=F_{1} \land F_{2}$,并且$F_{1}$中只涉及$E_{1}$中的属性,$F_{2}$中涉及$E_{1}$和$E_{2}$中的属性 ## (7)选择与并的分配律 $$\sigma(E_{1} \cup E_{2}) \equiv \sigma_{F}(E_{1}) \cup \sigma_{F}(E_{2})$$ - **假设**:$E=E_{1} \cup E_{2}$,$E_{1}$和$E_{2}$有相同的属性名 ## (8)选择与差运算的分配律 $$\sigma(E_{1} - E_{2}) \equiv \sigma_{F}(E_{1}) - \sigma_{F}(E_{2})$$ ## (9)选择对自然连接的分配律 $$\sigma_{F}(E_{1} \bowtie E_{2}) \equiv \sigma_{F}(E_{1}) \bowtie \sigma_{F}(E_{2})$$ - $F$只涉及$E_{1}$和$E_{2}$的**公共属性** ## (10)投影与笛卡尔积的分配律 $$\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})$$ - $A_{1},A_{2},...,A_{n}$是$E_{1}$的属性 - $B_{1},B_{2},...,B_{m}$是$E_{2}$的属性 ## (11)投影与并的分配律 $$\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})$$ # 二:查询树的启发式优化 - 这是对关系代数表示的查询树进行优化的方法 ## (1)典型的启发式规则 **<font color="ff0000">典型的启发式规则</font>** - **<font color="0000ff">【规则1】选择运算应尽可能先做</font>**:这是为了**减少中间结果的规模** - **<font color="0000ff">【规则2】投影和选择运算同时进行</font>**:这是为了**避免重复扫描** - **<font color="0000ff">【规则3】将投影运算与其前后的双目运算结合起来</font>**:这是为了**避免重复扫描** - **<font color="0000ff">【规则4】把某些选择运算和其前面的笛卡尔积结合起来成为一个连接运算</font>**:这是为了**减少中间结果的规模** - **<font color="0000ff">【规则5】提取公共子表达式(公因子)</font>**:这是为了**保存计算结果,避免重复计算** ## (2)实现算法 - **该算在遵循启发式规则,并应用关系代数表达式等价变换规则来优化关系表达式** - **该算法的输入和输出都是查询树(分别对应待优化和优化的关系表达式)** **<font color="ff0000">算法步骤</font>** - **<font color="0000ff">【步骤1】分解选择运算</font>**:这是为了**便于不同的选择运算沿树的不同分枝向树叶移动,一直移动到与这个选择条件相关的关系处,使选择尽可能先做**。$\sigma_{F_{1} \land F_{2} \land ... \land F_{n}} (E)\Rightarrow \sigma_{F_{1}}(\sigma_{F_{2}}(...(\sigma_{F_{n}}(E))...))$ - **<font color="0000ff">【步骤2】通过交换选择运算,将每个选择运算尽可能移动到叶端</font>**:利用**规则4~9**尽可能把选择移动到树的叶端 - **<font color="0000ff">【步骤3】通过交换投影运算,将每个投影运算尽可能移动到叶端</font>**:利用**规则3、11、10、5**尽可能把投影移动到树的叶端 - **<font color="0000ff">【步骤4】合并选择和投影的串接</font>**:利用**规则3~5把选择和投影的串接合并成单个选择、单个投影或一个选择后面跟一个投影**。这是为了**使多个选择或投影能同时进行,或在一次扫描中全部完成** - **<font color="0000ff">【步骤5】对内结点分组</font>**:每一**双目运算**($×$、$\bowtie$、$\cup$、$-$)和它**所有的直接祖先的一元运算结点**($\sigma$或$\Pi$)分为一组(如果其**后代直到叶子全是单目运算**,则也将他们并入该组);注意当双目运算是**笛卡尔积**($×$),而且**其后的选择不能与它结合为等值连接**时,则**不能**将选择与这个$×$并为一组 ## (3)实例演示 - 注意这是一个很重要的考点 【例】如下给出了一个SQL语句 ```sql SELECT Student.Sname FROM Student,SC WHERE Student.Sno=SC.Sno AND SC.Sno='2'; ``` **<font color="0000ff">将SQL语句转为关系代数表达式</font>** - 先对`Student`和`SC`做笛卡尔积 - 再对中间结果做选择(条件为 `Student.Sno=SC.Sno`) - 再对中间结果做选择(条件为`SC.Sno='2'`) - 最后投影 **结果为** $$\Pi_{Sname}(\sigma_{Student.Sno=sc.Cno \land sc.cno=2}(student × sc))$$ **<font color="0000ff">将关系代数表达式转为查询树</font>** ![在这里插入图片描述](https://img-blog.csdnimg.cn/eeaf0cbdac57409db637cfdf1effdc12.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5b-r5LmQ5rGf5rmW,size_20,color_FFFFFF,t_70,g_se,x_16) **<font color="0000ff">查询树优化</font>** ①**首先选择条件尽可能下移**: - `SC.Sno='2'`只和`SC`有关,所以它会沿着分支恰当的分支下移到`SC`的上方 - `Student.Sno=SC.Sno`同时涉及Student和SC,所以只能待在那里 ![在这里插入图片描述](https://img-blog.csdnimg.cn/f8ca580b28c348728a4227fbeebfdab8.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5b-r5LmQ5rGf5rmW,size_20,color_FFFFFF,t_70,g_se,x_16) **②:把选择和其之前的笛卡尔积合并为等值连接,或者干脆变为自然连接** ![在这里插入图片描述](https://img-blog.csdnimg.cn/ee42cb9384224aa8b08f1f9a4c98710c.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5b-r5LmQ5rGf5rmW,size_20,color_FFFFFF,t_70,g_se,x_16) --- 【例】查询选修了数据库课程的女生学号与姓名,如下是SQL语句 ```sql SELECT Student.Sno,Sname FROM Student,SC,Course WHERE Cname='datebase' AND Ssex='女'; ``` **<font color="0000ff">将SQL语句转为关系代数表达式</font>** $$\Pi_{Sno,Sname}(\sigma_{Cname='数据库' \land Ssex='女'}(SC \bowtie Course \bowtie Student))$$ **<font color="0000ff">将关系代数表达式转为查询树</font>** ![在这里插入图片描述](https://img-blog.csdnimg.cn/a9608f55f3fe4b00908e2c84d59f1ea1.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5b-r5LmQ5rGf5rmW,size_20,color_FFFFFF,t_70,g_se,x_16) **<font color="0000ff">查询树优化</font>** **①:选择条件复杂,先分解选择条件** ![在这里插入图片描述](https://img-blog.csdnimg.cn/7f2769de8b57493f824af768f1a3f7e3.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5b-r5LmQ5rGf5rmW,size_20,color_FFFFFF,t_70,g_se,x_16) **②:将选择运算尽可能移动到树的叶端** ![在这里插入图片描述](https://img-blog.csdnimg.cn/517e9613e8b749ba99bb4855a2a4ae28.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5b-r5LmQ5rGf5rmW,size_20,color_FFFFFF,t_70,g_se,x_16) **③:涉及了投影运算,所以也把它尽可能移动到树的叶端** - 投影运算下移时要保留连接属性 ![在这里插入图片描述](https://img-blog.csdnimg.cn/b6c5cb22d8f54517b0e2fcb56c78165b.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5b-r5LmQ5rGf5rmW,size_20,color_FFFFFF,t_70,g_se,x_16) **④:对内结点进行分组** ![在这里插入图片描述](https://img-blog.csdnimg.cn/5c4d372197a34af4991abf8bf02e1659.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5b-r5LmQ5rGf5rmW,size_20,color_FFFFFF,t_70,g_se,x_16) ![在这里插入图片描述](https://img-blog.csdnimg.cn/cd853d9e8c814c50acf22c9c52f95ada.png)
#数据库##考研#

数据库系统概论王珊第五版笔记

全部评论

相关推荐

不愿透露姓名的神秘牛友
11-27 10:46
点赞 评论 收藏
分享
找不到工作死了算了:没事的,雨英,hr肯主动告知结果已经超越大部分hr了
点赞 评论 收藏
分享
评论
点赞
收藏
分享
牛客网
牛客企业服务