PostGIS 地理信息数据 多核并行处理

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
云原生数据库 PolarDB 分布式版,标准版 2核8GB
RDS PostgreSQL Serverless,0.5-4RCU 50GB 3个月
推荐场景:
对影评进行热评分析
简介:

标签

PostgreSQL , PostGIS , 栅格 , raster , 多核并行


      背景

自从PostgreSQL 9.6支持CPU多核并行计算后,PostgreSQL最流行的插件之一PostGIS,用户对多核需求也越来越多。

原因是PostGIS中有大量的运算是非常耗费CPU资源的,比如raster类型相关的运算。

PostGIS tends to involve CPU-intensive calculations on geometries, support for parallel query has been at the top of our request list to the core team for a long time.

Now that it is finally arriving the question is: does it really help?

PostGIS 发布的2.3.1 版本,已经可以看到诚意了吧,以下函数已经支持并行计算了。

Mark ST_Extent, ST_3DExtent and ST_Mem* agg functions as parallel safe so they can be parallelized

pic

      扫描并行

扫描并行,比如扫描节点有大量数据要被过滤时,或者说查询子句中有大量的运算时,使用并行可以大大提升其效率。

例如

1. filter过滤掉大量的数据,并且filter本身运算量较大时,使用CPU多核并行,效果明显

select * from table where filter...;    

2. 当func函数或者OP操作符运算量较大时,使用CPU多核并行,效果非常明显

比如聚合运算,或者一些业务逻辑运算(虽然TABLE本身没几条记录,但是每条记录的运算耗时很长时,并行效果明显)。

select func(x), x op y from table ...;  

      JOIN并行

我们在使用explain 观察SQL时,或者使用perf跟踪SQL的开销时,对于一个多个表数据JOIN的SQL,如果JOIN的数据量很大,可能就会成为整个SQL的性能瓶颈。

现在可以使用CPU的多核并行来加速JOIN了。

      聚合并行

聚合操作,比如统计某个维度的平均值、最大、最小、SUM等,在金融、分析行业用得非常多,处理的数据量大,运算量也较大。

除了扫描码并行,聚合函数本身也要支持并行才行,比如sum,count, avg, 可以想象并行处理都是安全的。

应该这么说,凡是在分布式数据库中支持的2阶段聚合函数,并行都是安全的。

关于分布式数据库的2阶段并行聚合的原理请参考

《hll插件在Greenplum中的使用 以及 分布式聚合函数优化思路》

《Postgres-XC customized aggregate introduction》

      观察并行、并行原理

如果你要观看并行效果,这样设置一下就好了

postgresql.conf

max_worker_processes = 64  
max_parallel_workers_per_gather = 8  
parallel_tuple_cost = 0  
parallel_setup_cost = 0  
min_parallel_relation_size = 0  
force_parallel_mode = on  

table

alter table table_name set (parallel_workers=8);  

关闭并行效果

alter table table_name set (parallel_workers=0);  
set force_parallel_mode = off;  

      并行原理

参考

《PostgreSQL 9.6 并行计算 优化器算法浅析》

《PostgreSQL 9.6 并行计算 优化器算法浅析》

      GIS地理信息处理与并行

前面说的是几种使用多核并行的应用场景,那么对于GIS数据,如何利用这些并行技术呢?

下面的例子取自

http://blog.cleverelephant.ca/2016/03/parallel-postgis.html

1. 扫描并行

EXPLAIN ANALYZE   
  SELECT Count(*)   
    FROM pd   
    WHERE ST_Area(geom) > 10000;  

Finalize Aggregate    
(cost=20482.97..20482.98 rows=1 width=8)   
(actual time=345.855..345.856 rows=1 loops=1)  
->  Gather    
   (cost=20482.65..20482.96 rows=3 width=8)   
   (actual time=345.674..345.846 rows=4 loops=1)  
     Number of Workers: 3  
     ->  Partial Aggregate    
         (cost=19482.65..19482.66 rows=1 width=8)   
         (actual time=336.663..336.664 rows=1 loops=4)  
           ->  Parallel Seq Scan on pd    
               (cost=0.00..19463.96 rows=7477 width=0)   
               (actual time=0.154..331.815 rows=15540 loops=4)  
                 Filter: (st_area(geom) > 10000)  
                 Rows Removed by Filter: 1844  
Planning time: 0.145 ms  
Execution time: 349.345 ms  

2. JOIN并行

CREATE TABLE pts AS   
SELECT   
  ST_PointOnSurface(geom)::Geometry(point, 3347) AS geom,   
  gid, fed_num   
FROM pd;  

CREATE INDEX pts_gix   
  ON pts USING GIST (geom);  

找出与蓝色区域重叠的点

pic

EXPLAIN ANALYZE   
 SELECT Count(*)   
  FROM pd   
  JOIN pts   
  ON ST_Intersects(pd.geom, pts.geom);  


The ST_Intersects() function is actually a SQL wrapper on top of the && operator and the _ST_Intersects() function, but unwrapping it and using the components directly also has no effect.  

改成  

EXPLAIN ANALYZE   
 SELECT Count(*)   
  FROM pd   
  JOIN pts   
  ON pd.geom && pts.geom  
  AND _ST_Intersects(pd.geom, pts.geom);  

UPDATE: Marking the geometry_overlaps function which is bound to the && operator as PARALLEL SAFE allows PostgreSQL to generate parallel join plans when the index is in place.

3. 聚合并行

以ST_Union为例。

不建议使用ST_Union(),因为它使用的是级联UNION的方式,开启并行并没有效果,原因是需要使用memory copy, 聚合过程中,越到后面,耗费越大。

ST_MemUnion 可以替代ST_Union,在并行中取得很好的效果

“Fortunately” we have such an aggregate, the old union implementation from before we added “cascaded union”.

The “memory friendly” union saves memory by not building up the array of geometries in memory, at the cost of spending lots of CPU unioning each input geometry into the transfer state.

支持并行的ST_MemUnion聚合函数如下

CREATE AGGREGATE ST_MemUnion (  
  basetype = geometry,  
  sfunc = ST_Union,  
  combinefunc = ST_Union,  
  stype = geometry  
 );  

例如

EXPLAIN ANALYZE   
  SELECT ST_Area(ST_MemUnion(geom))   
    FROM pd   
    WHERE fed_num = 47005;  

 Finalize Aggregate    
 (cost=16536.53..16536.79 rows=1 width=8)   
 (actual time=2263.638..2263.639 rows=1 loops=1)  
   ->  Gather    
   (cost=16461.22..16461.53 rows=3 width=32)   
   (actual time=754.309..757.204 rows=4 loops=1)  
         Number of Workers: 3  
         ->  Partial Aggregate    
         (cost=15461.22..15461.23 rows=1 width=32)   
         (actual time=676.738..676.739 rows=1 loops=4)  
               ->  Parallel Seq Scan on pd    
               (cost=0.00..13856.38 rows=64 width=2311)   
               (actual time=3.009..27.321 rows=42 loops=4)  
                     Filter: (fed_num = 47005)  
                     Rows Removed by Filter: 17341  
 Planning time: 0.219 ms  
 Execution time: 2264.684 ms  

      小结

1. 自从PostgreSQL 9.6支持并行后,由于PostgreSQL开放了并行接口,比如聚合函数,使用并行时,会以两阶段方式运行,你需要增加一个合并函数。

周边的插件,也可以很方便的将原有的聚合或者操作符,改造为并行的模式,从而享受PostgreSQL多核并行带来的效果。

2. 其他加速技术,包括LLVM,列存储,向量化,算子复用,GPU加速等。

《PostgreSQL 向量化执行插件(瓦片式实现) 10x提速OLAP》

《分析加速引擎黑科技 - LLVM、列存、多核并行、算子复用 大联姻 - 一起来开启PostgreSQL的百宝箱》

https://github.com/pg-strom

      参考

https://trac.osgeo.org/postgis/wiki/WKTRaster

http://osgeo-org.1560.x6.nabble.com/Parallel-Support-td5258386.html

http://blog.cleverelephant.ca/2016/03/parallel-postgis.html

https://github.com/pramsey/postgis/tree/parallel

http://postgis.net/docs/manual-2.3/release_notes.html#idm40209

相关实践学习
使用PolarDB和ECS搭建门户网站
本场景主要介绍基于PolarDB和ECS实现搭建门户网站。
阿里云数据库产品家族及特性
阿里云智能数据库产品团队一直致力于不断健全产品体系,提升产品性能,打磨产品功能,从而帮助客户实现更加极致的弹性能力、具备更强的扩展能力、并利用云设施进一步降低企业成本。以云原生+分布式为核心技术抓手,打造以自研的在线事务型(OLTP)数据库Polar DB和在线分析型(OLAP)数据库Analytic DB为代表的新一代企业级云原生数据库产品体系, 结合NoSQL数据库、数据库生态工具、云原生智能化数据库管控平台,为阿里巴巴经济体以及各个行业的企业客户和开发者提供从公共云到混合云再到私有云的完整解决方案,提供基于云基础设施进行数据从处理、到存储、再到计算与分析的一体化解决方案。本节课带你了解阿里云数据库产品家族及特性。
目录
打赏
0
0
0
0
20686
分享
相关文章
《数据密集型应用系统设计》 - 数据模型和查询语言
《数据密集型应用系统设计》 - 数据模型和查询语言
87 0
ClickHouse大规模数据导入优化:批处理与并行处理
【10月更文挑战第27天】在数据驱动的时代,高效的数据导入和处理能力是企业竞争力的重要组成部分。作为一位数据工程师,我在实际工作中经常遇到需要将大量数据导入ClickHouse的需求。ClickHouse是一款高性能的列式数据库系统,非常适合进行大规模数据的分析和查询。然而,如何优化ClickHouse的数据导入过程,提高导入的效率和速度,是我们面临的一个重要挑战。本文将从我个人的角度出发,详细介绍如何通过批处理、并行处理和数据预处理等技术优化ClickHouse的数据导入过程。
305 0
Dask 与图形处理:大规模图数据的并行分析
【8月更文第29天】在大数据时代,图数据结构因其能够高效表达实体之间的复杂关系而变得越来越重要。然而,处理大规模图数据集往往需要高效的并行计算框架。Dask 是一个灵活的并行计算库,它能够与 Python 的现有科学计算生态系统无缝集成。本文将介绍如何利用 Dask 来处理和分析大规模的图数据结构。
298 4
第3章-图形处理单元-3.1-数据并行架构
第3章-图形处理单元-3.1-数据并行架构
55 1
关系型数据库Oracle并行处理能力
【7月更文挑战第10天】Oracle数据库的并行处理能力主要体现在其并行查询(Parallel Query, PQ)和并行执行(Parallel Execution, PE)功能上。这是Oracle为了提高大规模数据处理效率,特别是在多处理器或多核服务器环境中的性能而设计的功能。 1. **并行查询**:当一个SQL查询被提交给Oracle时,如果查询涉及到大量的数据操作,Oracle可以将这个查询分解成多个子任务,并行地在不同的处理器或核心上执行这些子任务,从而加快查询速度。并行查询可以应用于表扫描、索引扫描、排序、哈希连接等操作。 2. **并行执行**:并行执行是Oracle数据库的
132 2
高效数据处理:使用Python实现并行计算的技巧
传统的数据处理方式在面对大数据时可能效率不高,本文探讨如何利用Python中的并行计算技术来提升数据处理速度和效率,重点介绍了多线程和多进程的应用,以及如何选择合适的场景使用这些技术。
【大数据】LSM树,专为海量数据读写而生的数据结构
【大数据】LSM树,专为海量数据读写而生的数据结构
434 0
应用成本低出 N 倍的数据分析引擎 esProc SPL
我们介绍的 esProc SPL 是一个数据分析引擎,具备 4 个主要特点:低代码、高性能、轻量级、全功能。SPL 不仅写得简单,跑得也更快,既可以独立使用还能与应用集成嵌入,同时适用于多种应用场景。使用 esProc SPL 实现数据分析业务,整体应用成本将比以 SQL 为代表的传统技术低出几倍。
并行计算与NumPy:加速数据处理的新途径
【4月更文挑战第17天】本文探讨了使用NumPy结合并行计算加速数据处理的方法。并行计算通过利用多个处理单元提高处理大规模数据的效率,而NumPy虽不直接支持并行计算,但可与OpenMP、Cython或Dask等工具结合。OpenMP能并行化NumPy函数,Dask则用于分布式并行计算。同时,文中提醒注意数据划分、通信开销、并行化策略及负载均衡等问题。随着技术发展,未来并行计算将在数据处理领域发挥更大作用。
NoSQL“小钢炮”,Lindorm时空引擎Ganos轨迹处理实测
Lindorm作为一款阿里云推出的云原生超融合多模数据库,包含了流引擎、宽表引擎、对象引擎、搜索引擎等。最新发布的Lindorm已经深度融合了达摩院空天数据库引擎Ganos(Lindorm Ganos),可以一站式的解决海量轨迹场景的存储和各类查询需求,本文通过对Lindorm Ganos在常用的时空场景进行测试,用过程和实际的数据展示Lindorm Ganos的具备的能力和特性。
NoSQL“小钢炮”,Lindorm时空引擎Ganos轨迹处理实测

热门文章

最新文章

AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等