Рекомендации по поиску проблем и тонкой настройке PostgreSQL
pg_stat_database
datname- имя базы данных или NULL для общих объектов,numbackends- количество подключений к базе данных или NULL для общих объектов (текущее значение),xact_commit- количество зафиксированных транзакций (нарастающим итогом),xact_rollback- количество отменённых транзакций (нарастающим итогом),blks_read- количество блоков, прочитанных с диска (нарастающим итогом),blks_hit- количество блоков, найденных в кэше (нарастающим итогом),tup_returned- количество строк, возвращённых запросом (нарастающим итогом),tup_fetched- количество строк, переданных по сети (нарастающим итогом),tup_inserted- количество вставленных строк (нарастающим итогом),tup_updated- количество обновлённых строк (нарастающим итогом),tup_deleted- количество удалённых строк (нарастающим итогом),conflicts- количество запросов, отменённых из-за конфликта при восстановлении базы данных (нарастающим итогом, только для запасных серверов),temp_files- количество созданных временных файлов (нарастающим итогом),temp_bytes- объём данных, записанных во временные файлы (нарастающим итогом),deadlocks- количество взаимоблокировок (нарастающим итогом),blk_read_time- время, потраченное на чтение блоков данных (нарастающим итогом, если включена опцияtrack_io_timingили 0),blk_write_time- время, потраченное на запись блоков данных (нарастающим итогом, если включена опцияtrack_io_timingили 0),stats_reset- отметка времени последнего сброса статистики.
blks_hit, blks_read
При соотношении данных, прочитанных из кэша к общему объёму прочитанных данных blks_hit / (blks_hit + blks_read) ниже 0.8 стоит увеличить размер shared_buffers в файле конфигурации postgresql.conf.
xact_commit, xact_rollback
При низком соотношений подтверждённых транзакций к их общему количеству xact_commit / (xact_rollback + xact_commit) стоит проанализировать отменённые транзакции в журнале PostgreSQL.
deadlocks
Если взаимоблокировки происходят часто, то имеются ошибки в проектировании приложения. Для поиска проблем можно включить опцию в log_lock_waits в файле конфигурации postgresql.conf.
temp_files, temp_bytes
При частом создании временных файлов и/или большом их размере стоит включить опцию log_temp_files для обнаружения запросов, приведших к созданию временных файлов. Можно также увеличить размер work_mem в файле конфигурации postgresql.conf.
pg_stat_all_tables, pg_stat_user_tables и g_stat_sys_tables
relname- имя таблицы,seq_scan- количество последовательных сканирований таблицы,seq_tup_read- количество строк, прочитанных при последовательном сканировании,idx_scan- количество сканированией таблицы с использованием индекса,idx_tup_fetch- количество строк, прочитанных при сканировании с использованием индекса,n_tup_ins- количество вставленных строк,n_tup_upd- количество обновлённых строк, включая обновлённые на месте,n_tup_del- количество удалённых строк,n_tup_hot_upd- количество строк, обновлённых на месте,n_live_tup- расчётное количество живых строк,n_dead_tup- расчётное количество мёртвых строк,n_mod_since_analyze- расчётное количество изменённых строк после операции анализа таблицы,n_ins_since_vacuum- расчётное количество вставленных строк после операции сжатия таблицы,last_vacuum- отметка времени последней операции ручного сжатия, исключая полный,last_autovacuum- отметка времени последней операции автоматического сжатия,last_analyze- отметка времени последней операции ручного сжатия,last_autoanalyze- отметка времени последней операции автоматического сжатия,vacuum_count- количество ручных операций сжатия, исключая полный,autovacuum_count- количество автоматических операций сжатия,analyze_count- количество ручных операций анализа,autoanalyze_count- количество автоматических операций анализа.
n_tup_upd, n_tup_hot_upd
При обновлении строк PostgreSQL создаёт копию строки с новыми данными, а прежнюю строку помечает как устаревшую. Устаревшие версии строк могут использоваться внутри ещё не зафиксированных транзакций с уровнем REPEATABLE READ. Когда устаревшая строка более не используется ни в одной транзакции, занимаемое ей место можно отметить как свободное и записать на это место новую строку. Для экономии места на диске PostgreSQL периодически выполняет процедуру автоматического сжатия таблицы (так называемый VACUUM), собирая данные из нескольких разрежённых страниц в одну и уменьшая размер файлов на диске за счёт освободившихся страниц.
Если копия строки с новыми данными создаётся в другой странице, то нужно обновить индекс так, чтобы он указывал на новую страницу. Если копия строки была создана в пределах той же страницы и значения в столбцах, по которым поддерживаются индексвы, не менялись, то обновлять индекс не обязательно.
Если соотношение строк, обновлённых в пределах страницы, к обновлённым строкам n_tup_hot_upd / n_tup_upd низкое, то стоит уменьшить процент заполнения страниц таблицы при помощи запросов следующиего вида:
ALTER TABLE mytable SET (fillfactor = 70);
Это запрос повлияет только на заполнение новых страниц таблицы. Чтобы во всех страницах таблицы появилось свободное место, которое позволило бы чаще обновлять данные внутри страницы, можно воспользоваться запросом:
VACUUM FULL mytable;