PostgreSQL PostGIS point join polygon (by ST_xxxx) - pglz_decompress 性能优化

简介: postgresql 数据库
+关注继续查看

背景
在空间数据中,通常会有轨迹、点、面的数据,假设有两张表,一张为面的表,一张为点的表,使用包含 ST_xxxx(c.geom, p.geom) 来进行JOIN(例如以面为单位,聚合统计点的数量)。

pic

本文介绍了空间JOIN的性能分析,瓶颈分析,优化方法。

原文
http://blog.cleverelephant.ca/2018/09/postgis-external-storage.html

例子
测试数据:

Setup

First download some polygons and some points.

Admin 0 - Countries

Populated Places

Load the shapes into your database.

shp2pgsql -s 4326 -D -I ne_10m_admin_0_countries.shp countries | psql performance

shp2pgsql -s 4326 -D -I ne_10m_populated_places.shp places | psql performance
包含大量POINT的空间对象

SELECT count(*)
FROM countries
WHERE ST_NPoints(geom) > (8192 / 16);
1、使用默认的压缩格式时,这个空间JOIN查询,耗时25秒。

SELECT count(*), c.name
FROM countries c
JOIN places p
ON ST_Intersects(c.geom, p.geom)
GROUP BY c.name;
使用PERF或oprofile跟踪其耗时的代码

《PostgreSQL 代码性能诊断之 - OProfile & Systemtap》

《PostgreSQL 源码性能诊断(perf profiling)指南 - 珍藏级》

发现问题是解压缩的pglz_decompress 接口造成的。

《TOAST,The Oversized-Attribute Storage Technique - 暨存储格式main, extended, external, plain介绍》

2、将空间字段改成非压缩格式,耗时降到4秒。

-- Change the storage type
ALTER TABLE countries
ALTER COLUMN geom
SET STORAGE EXTERNAL;

-- Force the column to rewrite
UPDATE countries
SET geom = ST_SetSRID(geom, 4326);

vacuum full countries;

-- Re-run the query
SELECT count(*), c.name
FROM countries c
JOIN places p
ON ST_Intersects(c.geom, p.geom)
GROUP BY c.name;
小结
1、代码层面的性能瓶颈分析方法,perf.

《PostgreSQL 源码性能诊断(perf profiling)指南 - 珍藏级》

2、PostGIS空间相关计算函数

http://postgis.net/docs/manual-dev/reference.html

3、数据库表级存储格式包括4种:

对于定长的字段类型,存储格式如下:

PLAIN
prevents either compression or out-of-line storage; furthermore it disables use of single-byte headers for varlena types. This is the only possible strategy for columns of non-TOAST-able data types.
对于变长的字段类型,除了可以使用PLAIN格式,还可以使用如下存储格式:

EXTENDED
allows both compression and out-of-line storage.
This is the default for most TOAST-able data types.
Compression will be attempted first, then out-of-line storage if the row is still too big.

EXTERNAL
allows out-of-line storage but not compression.
Use of EXTERNAL will make substring operations on wide text and bytea columns faster (at the penalty of increased storage space) because these operations are optimized to fetch only the required parts of the out-of-line value when it is not compressed.

MAIN
allows compression but not out-of-line storage.
(Actually, out-of-line storage will still be performed for such columns, but only as a last resort when there is no other way to make the row small enough to fit on a page.)
4、本文发现的瓶颈为变长字段,压缩后,解压缩的pglz_decompress 接口,所以将字段的存储格式改为非压缩格式,即提升了大量的性能。

参考
http://blog.cleverelephant.ca/2018/09/postgis-external-storage.html

http://postgis.net/docs/manual-dev/reference.html

《TOAST,The Oversized-Attribute Storage Technique - 暨存储格式main, extended, external, plain介绍》

《PostgreSQL 源码性能诊断(perf profiling)指南 - 珍藏级》

《PostgreSQL 代码性能诊断之 - OProfile & Systemtap》
转自阿里云德哥

相关实践学习
使用PolarDB和ECS搭建门户网站
本场景主要介绍基于PolarDB和ECS实现搭建门户网站。
阿里云数据库产品家族及特性
阿里云智能数据库产品团队一直致力于不断健全产品体系,提升产品性能,打磨产品功能,从而帮助客户实现更加极致的弹性能力、具备更强的扩展能力、并利用云设施进一步降低企业成本。以云原生+分布式为核心技术抓手,打造以自研的在线事务型(OLTP)数据库Polar DB和在线分析型(OLAP)数据库Analytic DB为代表的新一代企业级云原生数据库产品体系, 结合NoSQL数据库、数据库生态工具、云原生智能化数据库管控平台,为阿里巴巴经济体以及各个行业的企业客户和开发者提供从公共云到混合云再到私有云的完整解决方案,提供基于云基础设施进行数据从处理、到存储、再到计算与分析的一体化解决方案。本节课带你了解阿里云数据库产品家族及特性。
目录
相关文章
|
6月前
|
JavaScript 前端开发 定位技术
Leaflet系列:加载GeoJSON数据
Leaflet如何加载GeoJSON数据
576 0
|
存储 SQL 前端开发
PostgreSQL 创建B-Tree索引的过程
Postgres支持B-tree, hash, GiST, and GIN,也支持用户通过Gist自定义索引方法,比如时空数据库的R-Tree索引。
PostgreSQL 创建B-Tree索引的过程
|
算法 JavaScript 关系型数据库
HashAggregate VS sort+GroupAgg
postgresql聚合算法选择
3523 0
|
开发工具 git
版本控制软件之Git
一、什么是版本控制 版本控制(Revision control)是一种在开发的过程中用于管理我们对文件、目录或工程等内容的修改历史,方便查看更改历史记录,备份以便恢复以前的版本的软件工程技术。
1348 0
|
Linux KVM 虚拟化
虚拟化之KVM
目录 一、安装 1.1、先确认CPU是否支持虚拟化 1.2、安装KVM及相关工具包 1.3、启动libvirtd并设置为开机启动 1.
1457 0
|
Ubuntu Java Apache
Ubuntu 16.04 LTS下安装配置Solr-Mmseg4j
安装环境:Ubuntu 16.04 LTS; Java JDK 1.8.0 目录 检查系统环境 安装Apache Solr 配置solr-mmseg4j 1.
1286 0
|
XML 数据格式 Python
Scrapy采集“人民的名义”豆瓣评价实验报告
转载请注明出处!!! 实验对象:豆瓣电影--人民的名义 实验目的:通过使用scrapy框架采集“人民的名义”评价内容,进一步体会信息检索的过程。 实验过程:分析采集实体->确定采集方法->制定爬取规则->编写代码并调试->得到数据 人民的名义 ps:由于最近豆瓣发布的 Api V2测试版 需要授权 走oauth2,但是现在不开放key申请,所以直接爬了网页。
1173 0
|
iOS开发
iOS 善意破解简书APP(非越狱篇)实现一键点赞
真机运行简书APP效果 说明: 本文没有任何搞破坏实质,网上逆向文章极少,希望借助简书APP来向初学者打开逆向开发的神秘面纱! 如果觉得还可以, 请留赞! 我想有一部分人想要知道或者说不知道达到上图最终效果我们需要会什么知识和需要有什...
1068 0
|
机器学习/深度学习 BI
推荐文章
更多