更新到 PostgreSQL 12 (windows) 后,从 pg_catalog.pg_settings 中进行选择变得很慢

Selecting from pg_catalog.pg_settings got slow after updating to PostgreSQL 12 (windows)

我们注意到性能读数严重下降 pg_catalog.pg_settings table 在 MS 上的 PostgreSQL 12 中 Windows 10 台机器与早期版本相比。

explain (analyze, buffers, timing)
SELECT * from pg_catalog.pg_settings where name =
'standard_conforming_strings';

PostgreSQL 12.5 上,由 Visual C++ build 1914 编译,64 位:

Function Scan on pg_show_all_settings a  (cost=0.00..12.50 rows=5
width=485) (actual time=343.350..343.356 rows=1 loops=1)
  Filter: (name = 'standard_conforming_strings'::text)
  Rows Removed by Filter: 313
Planning Time: 0.079 ms
Execution Time: 343.397 ms

PostgreSQL 11.13 比较,由 Visual C++ build 1914 编译,64 位:

Function Scan on pg_show_all_settings a  (cost=0.00..12.50 rows=5
width=485) (actual time=0.723..0.728 rows=1 loops=1)
  Filter: (name = 'standard_conforming_strings'::text)
  Rows Removed by Filter: 289
Planning Time: 0.125 ms
Execution Time: 0.796 ms

这是标准安装,修改后的参数为:

SELECT name, current_setting(name), source
FROM pg_settings
WHERE source NOT IN ('default', 'override');
name current_setting source
client_encoding UTF8 client
DateStyle ISO, YMD client
default_text_search_config pg_catalog.simple session
default_transaction_isolation read committed session
dynamic_shared_memory_type windows configuration file
extra_float_digits 3 session
lc_messages Lithuanian_Lithuania.1257 configuration file
lc_monetary Lithuanian_Lithuania.1257 configuration file
lc_numeric Lithuanian_Lithuania.1257 configuration file
lc_time Lithuanian_Lithuania.1257 configuration file
listen_addresses * configuration file
log_destination stderr configuration file
log_file_mode 0640 configuration file
log_timezone Europe/Helsinki configuration file
logging_collector on configuration file
max_connections 100 configuration file
max_stack_depth 2MB environment variable
max_wal_size 1GB configuration file
min_wal_size 80MB configuration file
port 5444 configuration file
search_path "$user", public session
shared_buffers 128MB configuration file
TimeZone Europe/Helsinki client

仅在 MS Windows 10 台机器上观察到速度变慢。我们有 pg12 linux (PostgreSQL 12.6 (Debian 12.6-1.pgdg100+1) x86_64-pc-linux-gnu, 由 gcc (Debian 8.3.0-6) 8.3.0, 64-bit ) 编译,不显示任何 性能下降。

我测试了不同的版本,问题似乎出现在PG12上, PG11 之前的早期版本工作正常。 PG13也有读数低的问题 pg_settings.

的速度

该行为在 3 台不同的机器上重现(2 台虚拟机和一台 物理,不同的硬件)。

这是什么原因?如何解决这个问题?

我找到了一个类似的问题Select from pg_settings is very slow,但仍然没有答案。

更新

我已经测试了 PostgreSQL 14 - 有明显的性能提升。 PostgreSQL 14.0,由 Visual C++ build 1914 编译,64 位

Function Scan on pg_show_all_settings a  (cost=0.00..12.50 rows=5 width=485) (actual time=8.502..8.508 rows=1 loops=1)
  Filter: (name = 'standard_conforming_strings'::text)
  Rows Removed by Filter: 343
Planning:
  Buffers: shared hit=18
Planning Time: 0.224 ms
Execution Time: 8.555 ms

它仍然比 PostgreSQL 11.13 慢 10 倍,但比 Pg12 快 40 倍。

编辑 2

正如 a_horse_with_no_name 所注意到的,我们在使用查询 current_setting.

时没有观察到性能问题
explain (analyze, buffers, timing) 
select current_setting('standard_conforming_strings');

returns:

Result  (cost=0.00..0.01 rows=1 width=32) (actual time=0.007..0.008 rows=1 loops=1)
Planning Time: 0.025 ms
Execution Time: 0.022 ms

我已将问题发布到 pgsql-performance 邮件列表,并从 Ranier Vilela 那里得到了答复,更新到最新版本的 PostgreSQL (v12.8.2) 应该可以解决问题。

他指示我去 message thread 讨论这个问题。问题似乎出在 libintl 库中,现在已修复。