再执行局部数据的查询语句Q2,返回局部查询结果Q2’,最后对局部查询结果Q1’和Q2’根据公共连接属性no进行自然连接操作,连接结果就是最终的全局查询结果。
假设student_1表和student_2表分别有1000条记录,student_1表中满足age>25的记录有100条,则中间查询结果的数据记录有100+100=200条。
由此可见,经过查询优化后,中间查询结果的数据记录大大减少了,下面就分布式数据库的查询优化技术进行详细的介绍。
3.3 查询优化算法3.3.1 基于关系代数等价变换的优化算法基于关系代数等价变换的优化算法使用启发式优化方法对关系代数表达式进行优化。
在关系代数表达式中,最花费时间和空间的运算是笛卡儿积和连接操作,为此,引出三条启发式规则,用于对表达式进行转换,以减少中间关系的大小[1]。
①尽可能早地执行选择操作;②尽可能早地执行投影操作;③避免直接做笛卡儿积,把笛卡儿积操作之前和之后的一连串选择和投影合并起来一起做。
基于关系代数等价变换规则的优化算法的基本思想是:把查询问题转变为关系代数表达式,分析得到的查询语法树,按等价变换规则优化(与集中式数据库的等价变换规则类似,这里不再详述)。
算法首先利用关系代数等价变换规则,把查询树中的连接和合并操作尽可能上提,选择和投影操作尽可能下移到片段的定义处。
然后判断是水平分片还是垂直分片,若为水平分片,则把分片条件与选择条件进行比较,去掉存在矛盾的片段,如果只剩下一个片段,就可以去掉一个并操作。
若为垂直分片,则把片段的属性集与投影操作所涉及的属性集进行比较,去掉无关的所有片段。
如果只剩下一个垂直片段,就可以去掉一个连接操作,从而达到优化查询的目的。
以全局数据模式中的学生表student(no,name,age,sex,class,grade)为例,先对学生表student进行垂直分片,使其分为student_1(no,name,age,sex)和student_2(no,name,class,grade)两个数据模式,再对student_1(no,name,age,sex)进行水平分片,使其分为student_11(sex=’m’)和student_12(sex=’f’)两个数据模式,最终形成student_11(sex=’m’)、student_12、student_2三个局部数据模式。
现在要查询性别为男性并且成绩在90分以上的所有学生的姓名,查询的SQL 语句为:select namefrom studentwhere sex=’m’ and grade>=90其关系代数表达式为:''90(())name sex m grade student πσ=∩>=关系代数表达式的查询树如图3.2所示: πσname''90sex m grade =∩>=student图3.2 关系代数表达式的查询树对应片段上的查询树如图3.3所示: π∞ππno,nameno σσ''sex m =90g r a d e >=∪student_11student_12student_2student_1.no=student_2.no name图3.3 对应的片段上的查询树由图 3.3可以看出student_12的分片条件与查询选择条件矛盾,故去掉student_12片段,也就去掉了一个合并操作,同时还去掉了一个对student_11片段的一个选择操作,从而达到了优化的目的。
优化后的查询树如图3.4所示。
π∞ππno,name noσ90g r a d e >=student_11student_2student_1.no=student_2.noname图3.4 优化后的查询树3.3.2 基于直接连接操作的优化算法这是一种完全在连接的基础上考虑查询处理的策略。
例如,对于一个涉及到存储在不同场地的三个关系进行连接的查询,首先把一个关系传送给第二个关系所在地,然后进行连接运算;再把运算结果传送到第三个关系所在地,计算它们的连接并产生查询结果。
假设关系R 在站点1,关系S 在站点2,在站点2需要获得R ∞S 的结果。
如果在站点2直接计算R ∞S 的值,那么需要先把关系R 从站点1传输到站点2,其执行示意图如图3.5所示。
图3.5 基于连接的执行示例3.3.3 基于半连接操作的优化算法基于半连接操作的优化算法的思想:数据在网络中传输时,以整个关系(也可以是片段)传输,显然是一种冗余的方法。
在一个关系传输到另一场地后,并非每个数据都参与连接操作或都有用。
因此,不参与连接的数据或无用的数据不必在网络中来回传输。
基于半连接的优化策略的基本原理就是采用半连接操作,在网络中尽量只传输参与连接的数据[1]。
可以采用半连接方法计算连接操作的值。
设R 和S 的公共属性为a ,方法如下:R ∞S =(R ∞()a S π)∞S=(R ∝S)∞S等式右边的式子称为半连接程序。
其执行示意图如图3.6所示。
图3.6 基于半连接的执行示例下面讨论这个半连接程序的操作过程和传输代价。
其传输代价用T=X C C 10+估算。
第①步:在站点2计算关系S 在属性a 上的投影()a S π。
第②步:把()a S π的结果从站点2传到站点1,其传输代价为:C 0+C 1*size(a)*val(a[S])其中size(a)表示属性a 的长度,val(a[S])表示关系S 中属性a 的个数。
第③步:在站点1计算半连接,设其结果为R ’,则R ’=R ∝S 。
实际上,这个操作是执行R ∞()a S π。
第④步:把R ’从站点1传到站点2,其传输代价为:C 0+ C 1*size(R)*card(R ’)其中size(R)是R 中元组的长度,card(R ’)是R ’的元组数。
第⑤步:在站点2执行连接操作R ’∞S 。
显然,步骤①、③、⑤无需传输费用,所以执行这样一个半连接程序,总的传输代价为:T 半=C 0+C 1*Size(a)*val(a[S])+ C 0+ C 1*Size(R)*card(R ’)=2*C 0+ C 1 (Size(a)*val(a[S])+ Size(R)*card(R ’))半连接运算不具有对称性,即没有交换性。
因此另一个等价的半连接程序 (S ∝R)∞R ,可能具有不同的传输代价。
通过对它们代价进行比较,就可以确定R 和S 的最优半连接程序。
假设站点1有一职工关系:emp(eno,ename,…)其属性为职工编号(6字节)、姓名(10字节)、…。
假设每个记录是100字节,关系中有10000个记录,那么关系的大小为100*10000=1000000字节。
在站点2有一部门关系:dept(dno,dname,…,eno)其属性为部门编号(4字节)、名称(10字节)、…、和部门经理的职工编号(6字节)。
假设每个记录是35字节,关系中有100个记录,那么关系的大小为35*100=3500字节。
现在考虑用户在站点2上有一个查询:检索每一部门的名称和部门经理的姓名。
假设每个部门都有一个经理,那么查询结果将包含100个记录,并且每个记录为20字节。
用半连接方法的步骤如下:① 在站点2,把dept 关系中的eno 值传输到站点1,即传输F=()eno dept π的值,它的大小为6*100=600字节。
② 在站点1,对被传输过来的F 和emp 关系做连接,然后把要求的属性值从连接结果传输到站点2上。
也就是传输R=,()eno ename emp F π∞,它的大小为16*100=1600字节。
③ 在站点2,通过被传输来的R 和dept 关系做连接来执行查询,然后在站点2上将结果呈现给用户。
这个半连接方法中的传输量为600+1600=2200字节。
在第②步中限制emp 的属性和元组传输到站点2,只传输那些在第③步中实际要与dept 元组做连接的属性和元组。
此时emp 关系的10000个元组中只有100个元组才传过去。
如果不采用半连接程序法,而直接采用连接法,如图3.5所示,那么需要把其中一个关系从一个站点传到另一个站点。
例如在站点2执行连接操作,相应传输代价为:T 连=C 0+C 1*size(R)*card(R)其中size(R)和card(R)分别为关系R 中元组的长度和元组的个数。
在一般情况下,card(R)>>card(R ’)是成立的,即T 半<< T 连成立,因此半连接程序法的传输代价较小,采用半连接程序执行连接操作是合适的。
对于复杂的连接查询,即多关系的连接,则可能存在多种半连接方案,而其中总有一个方案最佳。
采用半连接算法优化连接查询的步骤如下:① 计算每种可用的半连接方案的代价,并从中选择一个最近方案;② 计算采用连接方案的代价;③ 比较两种方案,确定最优方案。
3.3.4 SDD_1算法由美国计算机公司1978年研制的SDD_1是分布式数据库管理系统的第一个样机,该系统采用的分布式查询方法是多关系半连接算法。
在介绍SDD_1算法前,首先介绍选择因子及半连接的收益分析有关概念。
定义1 设R 、S 是两个关系,R 和S 半连接选择因子记为:SF sj (R ∝S)=card(()a S π)/card(S) [3]其中card(()a S π)是关系S 在关系R 和S 的公共属性a 上投影所包含的不同元组的个数,card(S)是关系S 的元组个数。
定义2 半连接代价公式记为:cost(R ∝S)=size(()a S π)=card(()a S π)*length(a) [3]其中length(a)是属性a定义的长度(字节数);半连接效益公式记为:benefit(R∝S)=(1-SF sj(R∝S))*size(R) [3]其中size(R)表示关系R的大小(字节数);有益半连接:benefit(R∝S)-cost(R∝S)>0的半连接;最有益半连接:多个半连接中,benefit(R∝S)-cost(R∝S)结果最大的半连接。
SDD_1查询优化算法大致思想是通过反复的获得有益半连接运算,减少每个站点上用于连接运算的数据,然后将所有站点的数据汇集到数据量最大的站点做最后装配。
处理过程主要包括三个步骤:⑴初始化:从全部关系中的半连接中生成有益的半连接集合;⑵选择有益的半连接:从有益的半连接集合中找出最有益的半连接,将其添加到执行策略中,并相应地修改被影响关系的统计值(选择因子,关系的大小等);⑶选择组装场地:重复第一步,直到所有有益的半连接加入到执行策略中,关系经上面步骤缩减后,选择存储数据量最大的站点为组装场地;为了便于说明和分析SDD_1算法,下面特举例说明。