我们是来自各地的大学生,一起参加openharmony的啃论文计划

作者:朱美颖 中原工学院

DDBMS

分布式数据库的出现

分布式数据库管理是数据库管理技术中一个新兴且发展迅速的子领域。因为它允许数据库系统在概念上充当集中式系统,同时在物理上反映当今世界组织的地理分布。即对外透明,在外部看起来与集中式数据库相同使得操作过程变得简单,但实现内部物理结构分散的数据管理。近几年来,分布式的数据库管理系统已经大体取代集中式管理系统。

分布式数据库的主要问题

mmexport1654595123429.jpg

该技术地图可以大致可以看到分布式数据库系统所大致研究的问题。

分布式查询处理和优化

本篇主要为介绍关于分布式查询处理和优化问题。

研究现状

现已有许多经典的算法,例如: 使用连接操作对查询进行优化;利用关系代数的等价原则对查询进行优化;利用代价模型查询图和贪心思想相结合实现优化;以多表连接查询的特征为基础,对粒子进行树形编码以实现全局的优化策略。 但最主要的还是分为两类:直接查询和半连接查询。

同时在近几年也有改进的优化算法,例如:基于蚁群算法的查询优化、基于鱼群算法的查询优化、 基于并行遗传-蚁群算法的查询优化等等。

关于查询的大致过程

层次结构

统共有四层

第一层查询分解:将全局的查询问题转化成一个统一的查询关系表达式,即从现实问题到计算机语言的转换。(例如SQL语句)

第二层数据本地化:将全局表达式分解为在相应片段上的表达式。

第三层全局优化:利用代价函数(CPU代价+I/O代价+通信代价)计算片段的代价,根据计算算出最佳的查询操作次序。若是在广域网中,通信代价是将会很大,称为取决性因素。

第四层局部优化:查询请求根据上一层分配到局部处理站点后,相当于一个集中数据库的环境,此时可以用集中性数据库的方法来进行查询优化。

过程简述

参考层次结构描述为:把全局查询分为若干个子查询对应相应的局部数据库,如果查询语言不一样那就根据查询下发位置的数据库语言更改查询语言,在局部数据库进行查询操作之后返回查询所得的数据,将各个查询所得的数据进行合并得到一个全局的查询结果统一返回。

查询优化算法的主要分类

查询优化算法主要可以分为直接连接算法和半连接算法,其他的算法多多少少取决于对这两种算法的改进。

基于半连接优化算法的查询优化算法

简述半连接优化算法

数据在数据库网络中的传输一般都是整个关系的传输,但在这个传输过程中,并非整个关系的所有数据都是有用的。半联接算法就是传输时舍弃无用的数据/不参与联接的数据,如下图所示半连接在第一次连接时只取判断条件中的相同的S的属性列。

image.png

​ 图1

详解半连接算法

第一种:

R∞A=BS=(R∝A=BS)∞A=BS=(∏R(R∞A=BS))∞A=BS =(R∞A=B(∏B(S)))∞A=BS

第二种S:

R∞A=BS=(S∝A=BR)∞A=BR=(∏S(S∞A=BR))∞A=BR=(S∞A=B(∏A (R)))∞A=BR

这是两个关系的两种半连接方式,4.1.1显示的是第一种半连接方式。

半连接算法就是通过一个属性相等的关系将一个元组和另一个元组的属性列相连接实现一步半连接,再将这个关系和只取属性列的元组进行直接连接。

计算代价

这里举第一种半连接的例子,其实两种的本质是一样的。

(1)运输代价公式为:

​ TC(X)=C0+C1*X

(2)由图1可知把∏B(S)运输到场地一的代价为:

​ T1=C0+C1size(B)val(S[B])

(size(B)是一个B属性的长度,val(S[B])是S中有效B的数量)

(3)由图1可知R∝A=BS送到场地二的代价为:

​ T2=C0+C1size(R∝A=BS)card(R∝A=BS)

(size(R∝A=BS)是R∝A=BS关系元组的长度,card(R∝A=BS)这个关系元组的数量)

(4)总代价为:

​ T=T1+T2=2C0+C1(size(B)val(S[B])+size(R∝A=BS)*card(R∝A=BS))

当card(R)>>card(R∝A=BS)时,半连接算法的优势就体现出来了,在网络传输的过程中,用半连接算法的时候传输代价比用直接连接算法的传输代价要低得多。

采用半连接算法也有其损失。

这个损失是如果采取直接连接算法就是直接把R送到场地二,而省略中间B属性列传输。如果这个传输代价小于利用半连接算法计算的总代价T的话,直接连接算法可能更有优势,不过要通过进一步的计算才能确定,因为上文只考虑了通信代价而没有考虑本地操作的代价。

半连接算法的应用

本文举例的是SDD-1算法,详细内容见下述。

基于直接连接优化算法的查询优化算法

关于直接连接优化算法

上面讲到了先半连接算法,会导致一些先入为主的概念,即最先了解到了直接连接算法的缺点,即是冗余传输,有时候直接连接,不对元组的连接进行缩减也可能会节约时间。

如上述分析,当R的数量比较少的时候,采取直接连接算法可能会更好一些。

直接连接优化算法的过程

直接连接有四种情况的处理算法

(1)站点依赖算法

了解前提:

如果有两个站点s,t他们分别有两个关系Ri,Rj,如果Ri和Rj在相同的属性A中有相等数值的A,则称Ri和Rj在属性A上站点依赖,用符号表示为:Ri∞ARj=∪(Fis∞AFjt);

Fis即在s上的i关系,Fjt即在t上的j关系。

∞A表示在A上的等值连接

站点依赖算法的过程:

  1. S=R,R={R1,R2,….,Rn}。

  2. 找到一对关系Ri,Rj使得Ri∞ARj ,Ri∞cRj在Q里,C包含A,将Ri,Rj放入S里,否则S返回空。

  3. 对于RK在R而不在S中,如果S中有关系RK∞BRX,且RK∞BRX在Q里,可把RK插入S中,循环直到S不能再添加为止。

  4. 若S=R,Q可在不发生站点间数据传输的情况下进行连接。

(2)分片和复制算法

查询有的情况是不能用无数据传送方式,分片和复制算法就是属于这一种。

算法描述:

  1. 将总查询分为一些子查询分布在一组站点上,这个步骤对应了查询的层次结构。

  2. 有些子查询的关系在站点上无体现的时候,将这些关系复制到选择的每一个站点上。

  3. 在子查询的处理过程中,在每个站点进行连接处理。

  4. 当选择的站点处理完所有子查询之后,返回总的查询结果

(3)连接依赖算法

连接依赖算法其实是结合了站点依赖算法和分片复制算法的结合,这里不是本文的重点,不再过多赘述。

(4)hash划分算法

见第六章。

SDD-1优化算法的发展过程

SDD-1优化算法是基于半连接算法的一种的优化算法,半连接算法见4.1.

SDD-1基本算法的简述

SDD-1基本算法的输入包括了分布式数据库的站点信息和查询语句合成的查询图表。

1.对收益进行估算:根据不同的子查询和站点信息得到所有半连接的属性关系表,然后对这个表进行收益估算。

2.对收益进行评估:在这个半连接表中找出最大收益的半连接选项进行半连接,再根据已经选择过的半连接选项修改剩余表中的信息,进行收益评估。再重复进行上述过程,依次进行收益评估,直到所有半连接都完成。

3.对数据进行装配:根据输入中的各站点信息进行分析,得到通信代价最小的站点,将上述得到的数据传输到这个站点进行数据装配。

SDD-1后算法的简述

1.根据上述的描述,在数据装配的站点进行收益评估所做的操作即半连接缩减,即上述的第二步和第三步合并了。

2.修正查询图G:根据上述可知,各关系的缩减程度呈下降比例,所以在SDD-1基本算法开始部分如果有连接操作,则在算法进行之前先进行连接操作缩减再执行SDD-1基本算法然后修正基本算法的输入的查询图,再用此查询图进行基本算法步骤。

SDD-1算法的改进

改进的原因:

在上面SDD-1基本算法的简述的第二个步骤里没有考虑最大收益有多个的并行的情况,在第三个步骤里没有考虑存在多个通信代价最小的站点应该怎么办的情况。

前提定义:

定义1 设有关系S、R,有半连接查询操作S∝R,称S为半连接查询S∝R的收益方.

定义2 有关系S、R1、R2,有半连接查询操作S∝Rl和S∝R2,如果半连接查询顺序:

先S∝Rl然后S∝R2等同于 :先S∝R2然后S∝Rl

称半连接查询S∝Rl、S∝R2为关系S的可并行半连接.

定义3 设R1、R2是半连接Rl∝R2的两个关系,则R1和R2半连接选择因子记为:

SFsj(Rl∝R2)=Card(∏a(R2))/Card(R2)

其中Card(∏a(R2))代表关系R2在关系R1和关系R2的公共属性a上投影所包含的不同元组个数,Card(R2)代表关系R2的元组个数。

定义4 设R、S是半连接R∝S的两个关系,则半连接R∝S收益公式记为:

Benefit(R∝S)一(1-SFsj(R∝S))*size(R)

其中Size(R)表示关系R的大小(字节数).

定义5 设有关系S、R通过半连接S∝R操作后,S的大小称为半连接S∝R的效果.

假设所有关系在各站点无冗余,请求查询从站点A发出.改进算法中用到的几个集合分别记为:BS为

收益半连接集合,EB为半连接效果集合,PB为可并行半连接集合,RB为最终执行策略集合.

此处引用[3] 谢旭升,陈复兴.基于并行的SDD-1算法的改进[J].山西大学学报(自然科学版),2013,36(03):338-343.中定义

改进后的算法步骤

  1. 采用Benefit(R∝S)=(1-SFsj(R∝S))*size(R),重复循环对计算SDD-1算法输入查询图中所有半连接的查询收益估算,将计算的结果表放入收益半连接集合BS中,将所有半连接的缩减程度放入半连接效果集合EB中。

  2. 每个站点有自己所储存的关系,搜索本站点的关系是否在收益半连接集合BS中有代表收益方与其他关系有可并发连接,并存入可并发半连接集合PB中。
  3. 由收益公式Benefit(R∝S)一(1-SFsj(R∝S))*size(R)的值代表排序关键字,对BS(半连接收益集合)中的半连接进行排序。
  4. 在半连接收益集合BS中找出收益最大的半连接M,设S为M的收益方,查找S在可并发半连接集合PB中是否有并发半连接存在。

如果S有可并发半连接存在在PB中,将S的所有可并发半连接和M一起加入到可执行策略集合RB中,然后将PB中S的可并发半连接数据记录删除,并将数据标记为并行性,即同时开始而且同时结束后该事件才结束。

如果S没有可并发半连接存在在PB中,将M加入到可执行策略集合RB中,并将数据标记为串行性,这个事件只有M一个需要执行的任务,执行完该事件就结束。

5.检验RB中是否已经加入查询图中的所有查询需要的半连接,若已经全部加入,按标记输出执行策略集合RB,若标记可并行性则同时执行,标记串行只完成单独的串行执行,如上述4;若没有全部加入,可能是第一步出了什么设计的差错,应该重新合理设计再继续执行算法步骤。

6.对半连接效果集合EB进行排序,若最大缩减关系只有一个,则选择此站点将(5)执行结果进行装配(缩减关系最大指的是这里关系处理的数据是最多的相比较于其他半连接站点,其他站点往此站点传输时数据传输量会低,如果选择数据装配站点可以优先选择此站点根据通信代价公式可得通信代价最小(通信代价公式上文已述如何计算))。若最大缩减关系有两个或两个以上,则在这些关系中选择与目的站点距离最近的站点将(5)执行结果进行装配(在数据装配前的通信代价为确定的,距离目的站点越近则总通信代价越低。)。

伪代码

上述的1-2步

image.png

上述的3-5步

image.png

关于Hash划分算法

了解Hash划分

Hash划分算法是目前较为流行的一种以直接连接为基础的优化算法。

和散列查找中的Hash算法类似,把有关系的元组们经过同一个Hash函数进行计算得到一个值,即是它的存储站点位置。如果不同元组经过Hash函数计算得到同样的站点位置即存储在同一个站点,在此无冲突解决问题。根据同一个Hash划分函数,有连接关系的元组经过划分后站点依赖。

重Hash问题

重Hash问题应用在什么场景

当多关系相连接时,进行重Hash划分会使查询速度更快。

重Hash问题的描述

多关系连接分为两种多关系

  1. 同一属性的多关系连接R1∞AR2∞AR3进行重Hash划分之后与原来未进行时相比较,多关系连接可以并行执行了,不用由R1找R2再找R3,R1,R2和R1,R3并行进行再合并结果,除了最后合并结果的时候,数据传输基本可以忽略。

  2. 不同属性的多关系连接R1∞AR2∞BR3这种情况有很多考虑方式,一般为先对A属性进行Hash划分,在对A划分的站点再对B属性进行划分,但在一个对A划分之后得到的站点中对B属性进行重划分时会得到关于B属性的不同站点位置,这时又要不停地进行数据移动,通信花费此时较大。解决此问题需要看重的是怎样尽可能地避免重划分带来的通信耗费。

重Hash问题的优化算法

重Hash问题的优化算法有很多,本文选择一种介绍,即Kruskal算法。

Kruskal算法

1.Kruskal算法的简述

Kruskal算法是一种贪心算法,在数据结构中用于求最小生成树。

在下图图示中根据边长排序一次选择最小的边每次选择一条边都看图能否构成回路,如果构成回路这条边会被舍弃,再进行下一次选择直到所有的点被遍历,由选择的边和全部被遍历的点构成的生成树为最小生成树。

image.png 图2

边的排序表为

a d b g c h e f
3 4 5 6 7 8 9 10

​ 图3

首先选择a,b,d,g,此时选择c出现了回路,c被舍弃,选择d无回路此时遍历完成,其余的边也被舍弃。
image.png

​ 图4

2.Kruskal启发式算法的大概过程

假设有一个一共有n个顶点的查询图QGq+。

由上述1中Kruskal算法的描述可以得知第一步为先求权值。

(1) 一条边上的两个端点表示进行连接操作的两个关系,权值是这两个关系连接的总代价Cost=PC(本地处理代价)+RC(重哈希划分代价),本地处理代价根据元组大小和元组数计算,重哈希划分代价首先先根据条件判断怎么重哈希再计算重哈希划分的代价。

(2) 选择权值最小的边,将这条边的两个端点合并,假设为R,S,同时记录R,S连接的代价Cost(RS)。如果出现了两条或以上同时最小的边,根据R.A=S.B这个判断条件在事先所依次编的号,选择最大编号的那一条边。

(3) 根据Kruskal算法规律重复上述操作,直到QGq+只有一个顶点位置。

3.Kruskal算法实现(伪代码)

image.png

4.Kruskal算法主要常用方法

(1)CostRS(R,S)计算两个关系连接代价。

(2)最小堆自下而上和最小堆自上而下的调整方法。

(3)最小堆的插入和删除方法。

(4)有固定逻辑顺序的Kruskal的主方法,即上述3.

参考文献

[1]陆海晶. 分布式数据库系统查询优化算法的研究[D]. 辽宁工程技术大学, 2007

[2]王慧玉.基于分布式数据库系统查询优化的研究与应用[D].大连海事大学,2005

[3] 谢旭升,陈复兴.基于并行的SDD-1算法的改进[J].山西大学学报(自然科学版),2013,36(03):338-343.

[4] 张静波.以并行遗传与蚁群算法为核心的分布式数据库优化[J].通讯世界,2018(01):268-269.

[5] 周 莹.基于多蚁群遗传算法的分布式数据库查询优化研究[D].上海师范大学,2016.

[6]M. Tamer ·zsu Patrick Valduriez .分布式数据库系统原理[M]

[7] 李川.SDI>I算法研究与改进[J].西安航空技术高等专科学校学报,2012,30(5):68—70.

想了解更多关于开源的内容,请访问:

51CTO 开源基础软件社区

https://ost.51cto.com/#bkwz