Трудно угадать причину этой проблемы; одно объяснение было бы замками.
Вы должны использовать auto_explain
, чтобы исследовать проблему.
В postgresql.conf
используйте следующие настройки:
# log if somebody has to wait for a lock for more than one second
log_lock_waits = on
# log slow statements with their parameters
log_min_duration_statement = 1000
# log the plans of slow statements
shared_preload_libraries = 'auto_explain'
# configuration for auto_explain
auto_explain.log_nested_statements = on
auto_explain.log_min_duration = 1000
Затем перезапустите PostgreSQL.
Теперь все операторы, которые превышают одну секунду, будут выгружать свой план в журнал PostgreSQL, поэтому все, что вам нужно сделать, - это дождаться повторения проблемы, чтобы вы могли проанализировать ее.
Вы также можете получить EXPLAIN (ANALYZE, BUFFERS)
вывод, если установить
auto_explain.log_buffers = on
auto_explain.log_analyze = on
Это сделало бы журнал более ценным, но значительно замедлило бы обработку, поэтому я неохотно делал бы это в производственной системе.