PostgreSQL PostGIS so 预加载(preload) 性能提升 - 暨什么动态库建议预加载

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

标签

PostgreSQL , PostGIS , preload , shared_preload_libraries , session_preload_libraries


背景

PostgreSQL是一个可扩展的数据库,如果你的扩展是C扩展,代码在动态库中。那么在使用时需要加载这个动态库来实现一些功能例如创建类型,创建函数,创建操作符等。

PostgreSQL允许多种加载动态库的方法,例如数据库启动时加载,会话连接(启动backend_process)时加载,或者在会话中调用到对应的动态库时再加载。

《PostgreSQL 加载动态库详解》

那么到底选择哪种加载方法呢?

1、数据库启动时加载,所有会话共享,对于常用的动态库(每个会话都会调用到的),建议使用这种方式加载。

2、会话启动或即用即加载的方法,不共享,并且每次加载需要一定的时间,每个会话需要本地存储一份库(更消耗内存一点)。对于不常用的动态库,可以使用这种方法。

PostGIS是PG的一个空间数据库扩展,同样也面临以上的选择,到底怎么选呢?根据上面的建议来。

下面给出一个例子

预加载带来的好处

如果我们设置了预加载,那么在数据库启动时,会自动加载以下动态库

postgres=# show shared_preload_libraries ;  
                         shared_preload_libraries                           
--------------------------------------------------------------------------  
 pg_stat_statements,postgis-2.4.so,postgis_topology-2.4.so  
(1 row)  

第一次执行的时间,与第二次执行的时间相仿。没有太大差异。

执行PostGIS的空间函数或类型等,不需要加载动态库。

postgres=# explain analyze select * from car where rest_sites=sites  order by pos<->gen_pos() for update limit 1;  
                                                               QUERY PLAN                                                                 
----------------------------------------------------------------------------------------------------------------------------------------  
 Limit  (cost=0.41..1.45 rows=1 width=94) (actual time=0.276..0.276 rows=1 loops=1)  
   ->  LockRows  (cost=0.41..50620.34 rows=48776 width=94) (actual time=0.274..0.274 rows=1 loops=1)  
         ->  Index Scan using idx_car_pos_2 on car  (cost=0.41..50132.58 rows=48776 width=94) (actual time=0.250..0.250 rows=1 loops=1)  
               Order By: (pos <-> '0101000020E610000032569BFF57EE5C4062670A9DD7203940'::geometry)  
               Filter: (rest_sites = sites)  
 Planning time: 1.365 ms  
 Execution time: 0.340 ms  
(7 rows)  
  
postgres=# explain analyze select * from car where rest_sites=sites  order by pos<->gen_pos() for update limit 1;  
                                                               QUERY PLAN                                                                 
----------------------------------------------------------------------------------------------------------------------------------------  
 Limit  (cost=0.41..1.45 rows=1 width=94) (actual time=0.162..0.162 rows=1 loops=1)  
   ->  LockRows  (cost=0.41..50620.34 rows=48776 width=94) (actual time=0.161..0.161 rows=1 loops=1)  
         ->  Index Scan using idx_car_pos_2 on car  (cost=0.41..50132.58 rows=48776 width=94) (actual time=0.152..0.152 rows=1 loops=1)  
               Order By: (pos <-> '0101000020E61000003B71395E81905C404A404CC285383B40'::geometry)  
               Filter: (rest_sites = sites)  
 Planning time: 0.314 ms  
 Execution time: 0.189 ms  
(7 rows)  

而如果我们不使用postgis预加载,那么性能又会怎么样呢?

第一次和第二次相差很大,需要加载动态库。

postgres=# show shared_preload_libraries ;  
                         shared_preload_libraries                           
--------------------------------------------------------------------------  
 pg_stat_statements  
(1 row)  
postgres=# explain analyze select * from car where rest_sites=sites  order by pos<->gen_pos() for update limit 1;  
                                                               QUERY PLAN                                                                 
----------------------------------------------------------------------------------------------------------------------------------------  
 Limit  (cost=0.41..1.45 rows=1 width=94) (actual time=0.271..0.271 rows=1 loops=1)  
   ->  LockRows  (cost=0.41..50620.34 rows=48776 width=94) (actual time=0.268..0.268 rows=1 loops=1)  
         ->  Index Scan using idx_car_pos_2 on car  (cost=0.41..50132.58 rows=48776 width=94) (actual time=0.241..0.241 rows=1 loops=1)  
               Order By: (pos <-> '0101000020E6100000E61E12BEF7775D404DF910548DEA3940'::geometry)  
               Filter: (rest_sites = sites)  
 Planning time: 52.728 ms  
 Execution time: 0.346 ms  
(7 rows)  
  
postgres=# explain analyze select * from car where rest_sites=sites  order by pos<->gen_pos() for update limit 1;  
                                                               QUERY PLAN                                                                 
----------------------------------------------------------------------------------------------------------------------------------------  
 Limit  (cost=0.41..1.45 rows=1 width=94) (actual time=0.174..0.174 rows=1 loops=1)  
   ->  LockRows  (cost=0.41..50620.34 rows=48776 width=94) (actual time=0.173..0.173 rows=1 loops=1)  
         ->  Index Scan using idx_car_pos_2 on car  (cost=0.41..50132.58 rows=48776 width=94) (actual time=0.161..0.161 rows=1 loops=1)  
               Order By: (pos <-> '0101000020E6100000F986C267EBBA5C4012FB04508CEC3940'::geometry)  
               Filter: (rest_sites = sites)  
 Planning time: 0.266 ms  
 Execution time: 0.199 ms  
(7 rows)  

参考

为了提高postgis插件的装载速度,应该将so文件配置为数据库启动时自动加载。

使用数据库启动时自动加载,还有一个好处,内存使用量也大大减少。

对于短连接业务,提升特别明显。因为短连接用户,每次发起新的连接后,第一次查询PLAN都会更慢,需要加载lib库。

小结

《如何加快PostgreSQL结巴分词pg_jieba加载速度》

《PostgreSQL 加载动态库详解》

相关实践学习
使用PolarDB和ECS搭建门户网站
本场景主要介绍基于PolarDB和ECS实现搭建门户网站。
阿里云数据库产品家族及特性
阿里云智能数据库产品团队一直致力于不断健全产品体系,提升产品性能,打磨产品功能,从而帮助客户实现更加极致的弹性能力、具备更强的扩展能力、并利用云设施进一步降低企业成本。以云原生+分布式为核心技术抓手,打造以自研的在线事务型(OLTP)数据库Polar DB和在线分析型(OLAP)数据库Analytic DB为代表的新一代企业级云原生数据库产品体系, 结合NoSQL数据库、数据库生态工具、云原生智能化数据库管控平台,为阿里巴巴经济体以及各个行业的企业客户和开发者提供从公共云到混合云再到私有云的完整解决方案,提供基于云基础设施进行数据从处理、到存储、再到计算与分析的一体化解决方案。本节课带你了解阿里云数据库产品家族及特性。
目录
相关文章
|
7月前
|
存储 关系型数据库 数据库
postgresql|数据库|提升查询性能的物化视图解析
postgresql|数据库|提升查询性能的物化视图解析
677 0
|
监控 关系型数据库 数据库
《PostgreSQL性能大提升:实用优化技巧》
《PostgreSQL性能大提升:实用优化技巧》
758 0
|
4月前
|
缓存 关系型数据库 数据库
PostgreSQL性能
【8月更文挑战第26天】PostgreSQL性能
72 1
|
3月前
|
缓存 关系型数据库 数据库
如何优化 PostgreSQL 数据库性能?
如何优化 PostgreSQL 数据库性能?
124 2
|
2月前
|
关系型数据库 PostgreSQL Docker
PostgreSQL - 01 PostgreSQL + PostGIS + Docker 空间计算!判断坐标点是否在某个区域中 POINT MULTIPOLYGON ST_Contains
PostgreSQL - 01 PostgreSQL + PostGIS + Docker 空间计算!判断坐标点是否在某个区域中 POINT MULTIPOLYGON ST_Contains
36 0
|
2月前
|
存储 关系型数据库 MySQL
四种数据库对比MySQL、PostgreSQL、ClickHouse、MongoDB——特点、性能、扩展性、安全性、适用场景
四种数据库对比 MySQL、PostgreSQL、ClickHouse、MongoDB——特点、性能、扩展性、安全性、适用场景
|
3月前
|
缓存 关系型数据库 数据库
PostgreSQL的性能
PostgreSQL的性能
154 2
|
4月前
|
缓存 关系型数据库 数据库
PostgreSQL 查询性能
【8月更文挑战第5天】PostgreSQL 查询性能
82 8
|
4月前
|
关系型数据库 Java 数据库
PostgreSQL性能
【8月更文挑战第5天】PostgreSQL性能
101 7
|
4月前
|
监控 关系型数据库 数据库
如何优化PostgreSQL的性能?
【8月更文挑战第4天】如何优化PostgreSQL的性能?
242 7

相关产品

  • 云原生数据库 PolarDB
  • 云数据库 RDS PostgreSQL 版