18143453325 在线咨询 在线咨询
18143453325 在线咨询
所在位置: 首页 > 营销资讯 > 信息时代 > 查询执行流水线法(数据库)

查询执行流水线法(数据库)

时间:2022-12-14 12:30:01 | 来源:信息时代

时间:2022-12-14 12:30:01 来源:信息时代

    查询执行流水线法 : 执行查询计划的一种方法。在查询计划树的执行过程中,子结点向父结点传递中间结果可有两种方式: 实体化方式和流水线方式。当内存不足时,或父子操作符之间存在天然的阻塞关系时,子结点需要以实体化方式向父结点传递中间结果,即子结点的输出结果将以临时文件形式写到磁盘上,父结点去磁盘上读数据。子结点以流水线方式向父结点传递中间结果时,子结点操作符的输出将写到内存缓冲区中,父结点操作符从缓冲区读数据,父子操作符可以并行执行,而不必等待子操作符执行结束。
查询执行的流水线过程可以分为需求驱动的流水线(demand-driven pipeline)和生产者驱动的流水线(producer-driven pipeline)两种方式。需求驱动的流水线比生产者驱动的流水线更容易实现,因而使用更广泛。
需求驱动流水线执行方式是一种自顶向下的执行方式。系统反复地向流水线顶端的操作符发出需求元组的请求。每当一个操作符收到需要元组的请求时,就计算下一个(几个)元组并返回这些元组。若该操作符的输入不是来自流水线,则下一个(几个)元组可以由输入关系中计算得到,同时系统记录目前为止已返回了哪些元组。若该操作符的某个输入来自流水线,那么该操作符也发出需求元组的请求以获得来自流水线输入的元组。使用来自流水线输入的元组时,子操作符计算输出元组,然后把它们传给父操作符。
生产者驱动流水线是一种自底向上的执行方式,各操作符并不等待元组请求,而是积极主动地产生元组。流水线底部的每个操作符不断地产生元组并将它们放在输出缓冲区中,直到缓冲区满为止。流水线中任何其他层的操作符只要获得较低层的输入元组就产生输出元组,直到其输入缓冲区为空或输出缓冲区充满为止。一个操作符使用流水线输入的一条元组后,将其从输入缓冲区中删除。一旦输出缓冲区已满或输入缓冲区已空,操作符必须等待,直到其父操作符将元组从该缓冲区取走,或子操作符产生新的输出元组。此时,该操作符接着产生更多的元组,直到输出缓冲区再次满了或输入缓冲区再次空了为止。这个过程不断重复,直到该操作符产生所有的输出元组为止。只有当一个输出缓冲区已满或一个输入缓冲区已空时,系统才需要在各操作符之间切换。在一个并行处理系统中,流水线中的操作符可在不同的处理器上并行执行。
使用生产者驱动的流水线方法可以看成将数据从一棵操作符树的底层推(push)上去的过程;而使用需求驱动的流水线方法可看成是从树顶将数据拉(pull)上来的过程。在生产者驱动流水线中,元组的产生是积极的; 而在需求驱动流水线中,元组消极地(lazily)按需求产生。
需求驱动的流水线中的每个操作符可以用迭代器(iterator)来实现,迭代器由三个函数组成: Open、GetNext和Close。Open函数负责初始化执行操作符所需的数据结构,但本身并不获得元组。GetNext函数负责返回符合条件的下一条元组,并对数据结构作必要的调整以得到后续元组,同时设置一条元组是否已产生或已没有元组可产生的标志。GetNext函数通常在一个循环结构中反复调用,以达到产生所有输出的目的。迭代器维护了两次调用GetNext之间的执行状态,这样下一个GetNext调用请求可以获取后面的结果元组。Close函数进行收尾工作,包括以各种方式清除DBMS的内部结构,通知缓冲区管理器某些缓冲区已不再需要等。
下面是一个表扫描操作符迭代器的实现方法。其中Open()操作符扫描第一条元组,并将状态置为true。GetNext()函数从前次记录的位置继续执行,并返回下一条元组。
Open(R)
{
b:=关系R的第一个数据块;
t:=块b的第一条元组;
found:=true;
}
GetNext(R)
{
if(t已到达块b最后一条元组后面){
b:=R的下一个数据块;
if(没有新的数据块){
found:=false;
return;
}
else/*这时b是一个新数据块*/
  t:=块b的第一条元组;
}
oldt:=t;
t:=块b的下一条元组;
return oldt;
}
Close(R){
} /*无操作*/

74
73
25
news

版权所有© 亿企邦 1997-2022 保留一切法律许可权利。

为了最佳展示效果,本站不支持IE9及以下版本的浏览器,建议您使用谷歌Chrome浏览器。 点击下载Chrome浏览器
关闭