PostgreSQL 9.6 新特性 - 并行查询

并行查询是PostgreSQL 9.6的一大亮点。尽管现在支持的功能有些少,但这些基础的设施PG实现全功能的查询的必要条件。期待PG之后的版本能够支持更多的并行查询。这里主要介绍下现在支持的并行查询,然后展望以后的并行会支持哪些并行查询功能。

目前PG支持的并行查询主要是顺序扫描(Sequencial Scans),并且支持部分链接查询(join)和聚合(aggregation)。可以说在实际的生产运用中不会有太大的帮助,因为我们往往会利用索引来查询。但正如之前说饿,这些是fundamental的设施,因此PG后续的版本就非常值得期待了!可以预测,一旦PG实现全功能的并行查询,其他的数据库(mysql,sqlserver等等)在性能方面将会甩出一大截。让我们拭目以待!

为什么要并行查询

性能和易用性是衡量一个数据库系统的重要指标。随着现代机器越来越多的CPUs(单个CPU的运算能力并没有太大的增长)和SSD存储的崛起(随机读写及I/O延迟大幅降低),这使得并行计算非常迫切,在应用程序实现并行会引入相应的复杂度,如果能在DB层面实现的话,应用程序将会非常简单(专注于如何写并行查询的query),对于大数据量的在线分析将会有非常大的帮助!可以想象,一条简单的SQL能够帮你完成快速的查询实在是很爽的一件事情!

目前支持的功能

1. 需要配置的参数

max_parallel_workers_per_gather: 最多会有多少个后台进程来一起完成当前查询。推荐值为1-4。这些workers主要来自max_worker_processes(进程池的大小)。

min_parallel_relation_size: 启用并行查询的最小数据表的size

parallel_setup_cost: 初始化一个后台进程的代价。其值越小,数据库越有可能使用并行查询

parallel_tuple_cost: 后台进程间传输一个元组的代价。其值越小,数据库越有可能使用并行

force_parallel_mode: 主要用于测试,on/true表示强制使用并行查询。

2. 并行顺序扫描(Parallel Sequencial Scans)

Seq Scan on foo的执行计划

Gather
   Workers Planned: 2
   Workers Launched: 2
      -> Parallel Seq Scan on foo

上述例子表明,有2个进程会协助主进程进行对表foo的扫描

3. 并行链接查询

目前的并行链接查询只支持两种链接:Nestloop Join和Hash Join

Gather
   Workers Planned: 2
   Workers Launched: 2
   -> Nested Loop
       -> Parallel Seq Scan on foo
       -> Index Scan using bar_pkey
          Index Cond: (b = foo.b)

上述例子表明,有两个进程会协助主进程对表foo和bar进行连接查询

Gather
Workers Planned: 2
 -> Hash Join
    Hash Cond: (foo.b = bar.b)
    -> Parallel Seq Scan on foo
    -> Hash
        -> Seq Scan on bar

当并行查询作用于哈希链接时,每一个后台进程都会在内存中有这个表的存储备份。如果work_mem比较大的话,查询会变得更快。

4. 并行聚合(Parallel Aggregates)

Finalize Aggregate
 -> Gather
    -> Partial Aggregate
       -> Nested Loop
          -> Parallel Seq Scan on foo
          -> Index Scan using bar_pkey
             Index Cond: (b = foo.b)

上述例子可以看出,PartialAggregate将会在每个后台进程中执行,最后主进程完成FinalizeAggregate。

哪些SQL不支持并行查询

1. 写入数据的SQL或者会lock数据库行的SQL

2. 如果数据库认为SQL包含部分执行或者增量执行,那么并行查询计划不会被生成。比如,一个游标(cursor)使用了DECLARE CURSOR。

3. 任何Parallel Unsafe的函数(Functions)和聚合(Aggregates)

4. 使用order by的聚合函数,或者查询中包含GROUPING SETS

5. 嵌套query中已经有使用并行查询的query

6. 处于事务隔离级别serializable中的SQL

7. 单用户的数据库系统

值得期待的全功能并行查询

1. 支持Merge Join

2. 并行的Bitmap扫描(现在仅支持Sequencial Scans)

3. 并行的索引扫描(Index scan和Index-Only Scan)

4. 支持Union的并行查询

5. 并行Vacuum和索引创建(Create Index



参考文章/网址

blog.2ndquadrant.com/po

kancloud.cn/taobaomysql

wiki.postgresql.org/ima

postgresql.org/docs/9.6

编辑于 2017-02-18