数据库并行查询是指针对查询语句使用并行处理。当目标语句发生全表扫描、全分区扫描及索引快速全扫描的情况时,优化器如果满足一些前提条件下是可以选择使用并行处理的。前提条件有:
1)会话并行查询特性:可以在会话一级启用或禁用并行查询,默认情况下是启用的。启用、禁用命令分别如下:
![](https://www.peixunla.com//file/upload/202204/01/182935471.png)
此外,还可以通过下面查询来查看当前会话是否启用了并行查询。
![](https://www.peixunla.com//file/upload/202204/01/182935921.png)
这个属性可返回enabled、disabled、forced,分别对应启用、禁用和强制。其中,强制是一种特殊的状态,它会强制查询语句指定并行度查询,甚至会覆盖后面讲到的对象并行属性。设置方法如下:
![](https://www.peixunla.com//file/upload/202204/01/182935771.png)
2)SQL语句并行提示:并行提示可以覆盖上面会话级别的设置。一方面,即使在会话级别禁用了并行查询,提示也可以强制执行一个并行操作。唯一可以用来关闭并行查询的方法是将parallel_max_servers设置为0。另一方面,即使在会话级别强制设置了一个并行度,提示还是可以改变另外一个并行度。并行提示是使用来指定的。
3)对象设置并行属性:在SQL语句相关的对象中可设置并行属性,也可使用并行查询。这是在对象定义时指定的,也可以后期修改。
下面通过几个示例,看看如何通过提示、对象属性及强制会话来完成并行查询。下面首先看看使用提示的方式。
![](https://www.peixunla.com//file/upload/202204/01/182935941.png)
下面解释一下执行步骤:
ID=6:扫描表的一部分,具体扫描哪个部分取决于它的父操作(即PX BLOCK ITERATOR)。
ID=5:将全表扫描分解为较小的扫描,这是一个涉及块范围粒度的操作。
ID=4:每个扫描汇总其count(status)的值。
ID=2、3:将每个子结果传递给查询调度进程。从这个执行计划中,可以通过TQ字段识别出哪些操作是由一组从属进程来执行的。
在这个计划中,操作3、4、5、6拥有同样的值(Q1,00),因此它们是由同一组从属进程执行的(从执行计划中无法得知从属进程的数量)。此外需要注意,操作3中的从属进程与查询调度进程(QC)之间的由并行到串行(P->S)的通信过程非常必要。
ID=1,进一步汇总这些结果,并输出答案。
下面看看使用对象属性的方式。
![](https://www.peixunla.com//file/upload/202204/01/182935141.png)
下面看看使用强制会话的方式。
![](https://www.peixunla.com//file/upload/202204/01/182935621.png)
![](https://www.peixunla.com//file/upload/202204/01/182935301.png)
还要注意一点,会话默认是启动并行查询的,可以将会话关闭。
![](https://www.peixunla.com//file/upload/202204/01/182935751.png)
![](https://www.peixunla.com//file/upload/202204/01/182935161.png)
通过上面的示例可见,并行查询执行计划与普通的串行操作的不同。下面说明在并行操作过程中各部分之间的关系。在并行执行的执行计划中会使用并行操作之间的下列关系。在dbms_xplan产生的输出中,并行操作之间的关系是通过字段IN-OUT来提供的。
并行到串行(P->S):并行操作发送数据到串行操作。通常是并行进程将数据发给并行调度进程。
并行到并行(P->P):一个并行操作发送数据给另一个并行操作。当存在两组从属进程时就会用到它。
并行与父操作合并(PCWP):执行计划中的相同从属进程并行执行一个操作及其父操作(父操作也是并行的)。因此,没有通信发生。
并行与子操作合并(PCWC):执行计划中的相同从属进程并行执行一个操作及其子操作(子操作也是并行的)。因此,没有通信发生。
串行到并行(S->P):一个串行操作发送数据给并行操作。由于大部分时间这个操作的效率都较差,因此应该避免使用它。有两个情况会产生这个操作。一个是单一进程产生数据的速度可能没有多个进程消费数据的速度快。如果是这样,消费者可能花费更多的时间来等待数据而不是真正地处理数据。另一个是,串行执行的操作和并行执行的操作发送数据需要一些不必要的通信。