更新到 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
库中,现在已修复。
我们注意到性能读数严重下降 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
库中,现在已修复。