在 POSTGRESQL 中执行函数和过程
为了理解 PostgreSQL 的工作原理,我们首先要看一个简单的函数调用。下一个清单显示了一些简单的PostGIS代码:
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 可以确保第一次使用连接时库已经存在。当然,我们将看到一些显著的性能改进:
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考试