使用预加载库优化 PostgreSQL 函数#postgresql认证

在 POSTGRESQL 中执行函数和过程

为了理解 PostgreSQL 的工作原理,我们首先要看一个简单的函数调用。下一个清单显示了一些简单的PostGIS代码:

sql 复制代码
PgSQL
test=# timing 
Timing is on.
test=# SELECT * FROM hans.points WHERE id = 1;
 id │                         p                          
════╪════════════════════════════════════════════════════
  1 │ 0101000020E610000097515B9536C33140A252824D6FDC1440
(1 row)
 
Time: 10.004 ms
test=# SELECT * FROM hans.points WHERE id = 1;
 id │                  *       p                          
════╪════════════════════════════════════════════════════
  1 │ 0101000020E610000097515B9536C33140A252824D6FDC1440
(1 row)
 
Time: 0.664 ms

在标准PostgreSQL数据库连接中,PostGIS 尚不可用。事实上,在连接中第一次使用 PostGIS 时必须加载它。我们看到第二次调用比第一次调用快得多,因为在第一次调用期间库被加载和初始化。数据库重启后,第一次调用可能是一个重大的性能问题。考虑一下:重启后缓存是冷的,库尚未加载,并且必须建立连接 - 这可能会导致一系列相当严重的问题,而且这些问题都同时发生。

尽早加载库

解决这个问题的一种方法是利用 PostgreSQL 中一个相当老的功能:session_preload_library 可以确保第一次使用连接时库已经存在。当然,我们将看到一些显著的性能改进:

sql 复制代码
PgSQL
> PGOPTIONS='-c session_preload_libraries=postgis-3' psql -U postgres
...
 
test=# timing 
Timing is on.
test=# SELECT * FROM hans.points WHERE id = 1;
 id │                         p                          
════╪════════════════════════════════════════════════════
  1 │ 0101000020E610000097515B9536C33140A252824D6FDC1440
(1 row)
 
Time: 2.809 ms
test=# SELECT * FROM hans.points WHERE id = 1;
 id │                         p                          
════╪════════════════════════════════════════════════════
  1 │ 0101000020E610000097515B9536C33140A252824D6FDC1440
(1 row)
 
Time: 0.674 ms

第一次调用比以前快得多。第二次调用仍然比第一次调用慢很多,因为我们仍然需要做一些初始化工作。但是,我们已经减少了第一次调用的大量开销,这在重新启动、集群故障等情况下非常有用。

结论

所有服务器端语言都作为库加载,扩展和许多其他东西也是如此。因此,session_preload_libraries 可以真正帮助加快数据库连接中的第一次调用。
#PG培训#PG考试#postgresql培训#postgresql考试

相关推荐
这个DBA有点耶3 小时前
AI写的SQL跑崩了生产库,这锅谁背?
数据库·人工智能·程序员
镜舟科技4 小时前
Databricks 再提 LTAP,AI 时代的数据底座为何重回大一统叙事?
数据库·架构·agent
Databend4 小时前
从湖仓升级为 Agent 时代的数据控制面,Snowflake 和 Databricks 有哪些布局
大数据·数据库·agent
ClouGence8 小时前
SQL Server CDC 能放到 Always On 备库读吗?一文讲透原理与实践
数据库·sql server
先吃饱再说1 天前
存储的进化:从 MySQL 到浏览器缓存,数据到底住在哪?
数据库
Nturmoils1 天前
字段太多看不全,ksql 的展开模式和输出控制怎么用
数据库·后端
Databend1 天前
Agent 轨迹分析与归因的数据工程实践
大数据·数据库·agent
这个DBA有点耶1 天前
SQL改写进阶:标量子查询的“隐形代价”与消除实战
数据库·mysql·架构
smallyoung1 天前
数据库乐观锁深度解析:MySQL、PostgreSQL 实战 + Spring Boot 集成指南
数据库·mysql·postgresql
parade岁月1 天前
MySQL JOIN解析:朴实无华但食之有味
数据库·后端