Oracle并行执行服务器(parallel execution servers)

来源:互联网 发布:java简历ssh项目 编辑:程序博客网 时间:2024/05/22 17:06

 Oracle并行执行服务器

Oracle为所有的并行操作(并行查询,并行DML,并行DDL,并行数据加载,并行恢复,并行复制等)提供了一整套的支持机制。其中并行DDL与其他Oracle并行操作有很多相似的地方,例如都是由主执行服务器(协调者)首先分析所要执行的操作以及机器的配置,决定并行度(完成一个操作所需的并行执行服务器的数目,仅适用于内部操作)是多少,然后动态的将操作切分为子任务并获得足够多的并行执行服务器,向并行执行服务器分配任务。当所有并行执行服务器完成了各自的子任务之后,主执行服务器将所有的子结果收集,并将结果返回给用户进程。


并行执行服务器池

Oracle为每一个实例(instance)创建一个并行执行服务器池,并行执行服务器等待上层分配子任务,当其获得子任务后会去执行该子任务,当其完成子任务后又会等待新的子任务被分配给自己。并行执行服务器在某一时刻只会执行一个SQL 操作,例如不会同时执行并行的DDL与并行的DML。

对于并行执行服务器池,有两个参数来控制池中并行执行服务器的数目。一个是最小并行执行服务器数目,表示当一个实例启动的时候池中并行执行服务器的下界,其默认值是0,也就是在实例创建的时候池中没有并行执行服务器。另一个是最大并行执行服务器数目,其意义与最小并行执行服务器数目相似。创建并行执行服务器会占用一些资源和时间,因此需要根据需求以及实际的机器配置来设置最大及最小并行执行服务器数目,以确保并行操作所带来的优化效果达到最优。在实际使用中可以根据可用的处理器数目(内存和磁盘IO等不会称为瓶颈的时候)来确定需要启动多少个并行执行服务器,可以使其值等于可用处理器的数目。当并行执行服务器的数目大于处理器的数目时,常常并不能带来更多的优化。


并行执行服务器组



图1 并行执行服务器互相连接示意图

 

当在处理某些含有并行查询的复合操作时(例如DDL中的Create Index),Oracle会创建两组并行执行服务器,称为生产者队列服务器组和消费者队列服务器组。生产者服务器组负责从数据表中获取该操作所需的行,而消费者队列服务器会对这些行做一些join,sort,DML,DDL等操作。

每个生产者队列服务器中的并行执行服务器都会与所有消费者队列服务器中的并行执行服务器建立连接,若为机群版本则需要高速的网络协议互相通信。每个并行执行服务器有1~2块用于与其他并行执行服务器进行数据传输的消息缓冲区。不同消息缓冲区的数据传输是异步的,这样能很好的提高并行的效率。图1为并行执行服务器互相连接示意图,所有的并行执行服务器均与协调者相连,这里省略未画出。生产者队列服务器与消费者队列服务器各处理各自的内部操作,每个内部操作的并行度都为3。

并行执行服务器组之间的数据传输方式有如下几种:Range,即根据数值的范围来决定什么样的数据传送到哪个消费者并行服务器;Hash,即根据数据的hash值来决定要发送到哪个消费者并行服务器;Random,即完全随机的发送数据到消费者并行服务器;Round Robin,即以环形遍历的方式分发数据,类似于打牌时几个人交替环形的出牌。


并行执行服务器组的实现

Oracle在Windows下的诸多版本中并行执行服务器是多线程来实现协同工作的。因为Windows平台真正的实现了多线程,对多线程的工作机制提供了完善的支持,系统调度的时候也是调度线程。

而Oracle在Linux下的版本中并行执行服务器是利用多进程来实现的。因为Linux环境中并没有真正的实现对多线程很完善的支持。多线程在Linux环境中内核态仅仅是作为轻量级进程存在。


原创粉丝点击