PostgreSQLPostGISpointjoinpolygon(byST_xxxx)-pglz_decompress效能優化
背景
在空間資料中,通常會有軌跡、點、面的資料,假設有兩張表,一張為面的表,一張為點的表,使用包含 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》
轉自阿里雲德哥
相關文章
- 【前端效能優化】vue效能優化前端優化Vue
- 效能優化優化
- 效能優化案例-SQL優化優化SQL
- 【效能優化】ORACLE資料庫效能優化概述優化Oracle資料庫
- 前端效能優化(JS/CSS優化,SEO優化)前端優化JSCSS
- Android效能優化----卡頓優化Android優化
- 前端效能優化 --- 圖片優化前端優化
- [效能優化]DateFormatter深度優化探索優化ORM
- MySQL 效能優化之索引優化MySql優化索引
- Web效能優化:圖片優化Web優化
- MySQL 效能優化之SQL優化MySql優化
- Android效能優化篇之計算效能優化Android優化
- mysql效能優化MySql優化
- Redis 效能優化Redis優化
- 效能優化有感優化
- react效能優化React優化
- javascript效能優化JavaScript優化
- Javascript 效能優化JavaScript優化
- php效能優化PHP優化
- 前端效能優化前端優化
- JVM效能優化JVM優化
- java效能優化Java優化
- TableView效能優化View優化
- mongodb效能優化MongoDB優化
- Canvas效能優化Canvas優化
- web效能優化Web優化
- MySQL——效能優化MySql優化
- oracle 效能優化Oracle優化
- React 效能優化React優化
- Spark效能優化Spark優化
- 效能優化篇優化
- Openfire 效能優化優化
- UI效能優化UI優化
- javasciprt效能優化Java優化
- EF效能優化優化
- sql效能優化SQL優化
- Hive效能優化Hive優化
- iOS效能優化iOS優化