PDQ 查询的结构

每个决策支持查询都有主线程。数据库服务器可能启动附加的线程来执行查询任务(例如:扫描和排序)。根据查询必须搜索的表或分段的数量以及决策支持查询可使用的资源,数据库服务器将查询的不同组成部分分配给不同的线程。

数据库服务器启动这些 PDQ 线程,这些线程在 SET EXPLAIN 输出中列为辅助线程

根据其功能,辅助线程可进一步分类为生产者消费者。生产者线程给另一线程提供数据。例如:扫描线程可从与给定的表相对应的共享内存读取数据并将数据传递到连接线程。在这种情况下,扫描线程被看作生产者,而连接线程则被看作消费者。反过来,连接线程也可将数据传递到排序线程。当执行此操作时,连接线程被看作生产者,而排序线程则被看作消费者。

几个生产者可以向单个消费者提供数据。当这种情况发生时,数据库服务器建立一个内部机制,称为交换,该机制使从那些生产者到消费者的数据传输同步。例如:如果要对分段表进行排序,那么优化器通常对于每个分段调用不同的扫描线程。由于 I/O 特征有所不同,因而扫描线程预期可能完成的时间也将不同。交换用来将各种扫描线程产生的数据传递给一个或多个排序线程,而最低限度地使用缓冲。 根据查询的复杂性,优化器可能会需要一个生产者、交换和消费者的多层层次结构。 一般来讲,消费者线程与生产者线程并行工作,以便交换执行的中间缓冲量可忽略。

数据库服务器自动并透明地创建这些线程和交换。当完成对给定的查询的处理时,它们将自动终止。数据库服务器按后续查询需要创建新的线程和交换。