资讯专栏INFORMATION COLUMN

PostgreSQL9.6:Parallel sequential scans 初体验

wangdai / 3389人阅读

摘要:一关于参数这个参数配置决定了每个并行操作允许的最大后台进程数,这个值的设置受后台进程数参数限制。查看并行顺序扫描进程备注图中可看到出现了四个进程。三测试测试之前先把的数据库关了,在确保相等情况下进行测试。

Oracle 支持强大的并行功能,创建索引,表分析,数据加载时可以开启并行,这项功能让很多数据库产品垂涎, 作为开源数据库 PostgreSQL 在并行方面也在努力尝试,很早之前 PostgreSQL 几乎不支持任何并行的作业,到了 9.5 版本 PostgreSQL 支持并行的 vacuum,到了 9.6 后, PostgreSQL 支持并行的顺序扫描,这是令人振奋的消息,因为这极大的提升了 PostgreSQL 统计分析SQL的性能,由于硬件环境限制,今天简单体验下,以下实验在笔记本虚拟机上进行。

一 关于 max_parallel_degree (integer) 参数

这个参数配置决定了每个 parallel query 并行操作允许的最大后台进程数,这个值的设置受后台进程数参数 max_worker_processes 限制。

二 PostgreSQL9.6 Beta1 测试

--设置 max_parallel_degree

[pg96@db1 ~]$ grep "max_parallel_degree" $PGDATA/postgresql.conf
max_parallel_degree = 4                 # max number of worker processes per node

--创建测试表

[pg96@db1 ~]$ psql francs francs
psql (9.6beta1)
Type "help" for help.

francs=> create table test_big1(id serial, name character varying(64),create_time timestamp(0) without time zone);
CREATE TABLE

francs=> insert into test_big1(id,name)select n, n||"_test" from generate_series(1,5000000)n;
INSERT 0 5000000 

--执行计划

francs=> explain analyze select count(*) from test_big1;
-------------------------------------------------------------------------------------------------------------------------------------------------
 Finalize Aggregate  (cost=45560.42..45560.43 rows=1 width=8) (actual time=4236.468..4236.469 rows=1 loops=1)
   ->  Gather  (cost=45560.00..45560.41 rows=4 width=8) (actual time=4232.517..4232.556 rows=5 loops=1)
         Workers Planned: 4
         Workers Launched: 4
         ->  Partial Aggregate  (cost=44560.00..44560.01 rows=1 width=8) (actual time=4182.972..4182.973 rows=1 loops=5)
               ->  Parallel Seq Scan on test_big1  (cost=0.00..41435.00 rows=1250000 width=0) (actual time=0.034..2450.966 rows=1000000 loops=5)
 Planning time: 112.309 ms
 Execution time: 4236.920 ms
(8 rows)

备注:执行多次,执行时间大概都在4秒多点,从执行计划中看到走了并行顺序扫描“Parallel Seq Scan on test_big1”,再细看“Workers Launched: 4”,表示开启了四个并行进程。

--查看并行顺序扫描进程

备注:图中可看到出现了四个 parallel worker 进程。

三 PostgreSQL9.5 测试

测试之前先把 PostgreSQL 9.6 的数据库关了,在确保相等情况下进行测试。

--创建测试表

[pg95@db1 ~]$ psql fdb fdb
psql (9.5alpha1)
Type "help" for help.

fdb=> create table test_big1(id serial, name character varying(64),create_time timestamp(0) without time zone);
CREATE TABLE

fdb=> insert into test_big1(id,name)select n, n||"_test" from generate_series(1,5000000)n;
INSERT 0 5000000

fdb=> explain analyze select count(*) from test_big1;
                                                         QUERY PLAN                                                         
----------------------------------------------------------------------------------------------------------------------------
 Aggregate  (cost=91435.00..91435.01 rows=1 width=0) (actual time=8389.093..8389.094 rows=1 loops=1)
   ->  Seq Scan on test_big1  (cost=0.00..78935.00 rows=5000000 width=0) (actual time=9.958..4781.116 rows=5000000 loops=1)
 Planning time: 2.436 ms
 Execution time: 8391.758 ms
(4 rows)

备注:多次执行,时间在 8 秒左右。

四 总结

由于硬件关系原因,本测试只在笔记本虚拟机上测试,在这个全表扫描测试场景下, PostgreSQL 9.6 是 PostgreSQL9.5 性能的两倍,今天仅是初步体验并行扫描,可以预测如果在X86服务器上测试,这个性能倍数会高一些,后续测试并行扫描的其它场景;个人认为 PostgreSQL 对并行顺序扫描的支持,在统计分析性能方面的提升前进了一大步。

五 参考

Robert Haas: PostgreSQL 9.6 with Parallel Query vs. TPC-H
max_parallel_degree (integer)

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/38977.html

相关文章

  • Deep Learning 相关库简介

    摘要:首先是最顶层的抽象,这个里面最基础的就是和,记忆中和的抽象是类似的,将计算结果和偏导结果用一个抽象类来表示了。不过,本身并没有像其它两个库一样提供,等模型的抽象类,因此往往不会直接使用去写模型。 本文将从deep learning 相关工具库的使用者角度来介绍下github上stars数排在前面的几个库(tensorflow, keras, torch, theano, skflow, la...

    ThinkSNS 评论0 收藏0
  • 转 | Java8体验(二)Stream语法详解

    摘要:第一个函数生成一个新的实例第二个函数接受两个参数,第一个是前面生成的对象,二个是中包含的元素,函数体就是把中的元素加入对象中。 感谢同事【天锦】的投稿。投稿请联系 tengfei@ifeve.com 上篇文章[Java8初体验(一)lambda表达式语法]()比较详细的介绍了lambda表达式的方方面面,细心的读者会发现那篇文章的例子中有很多Stream的例子。这些Stream的例子可...

    taoszu 评论0 收藏0
  • 《java 8 实战》读书笔记 -第七章 并行数据处理与性能

    摘要:正确使用并行流错用并行流而产生错误的首要原因,就是使用的算法改变了某些共享状态。高效使用并行流留意装箱有些操作本身在并行流上的性能就比顺序流差还要考虑流的操作流水线的总计算成本。 一、并行流 1.将顺序流转换为并行流 对顺序流调用parallel方法: public static long parallelSum(long n) { return Stream.iterate(1L...

    刘福 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<