Skip to content

Commit f47bbf8

Browse files
Представления для анализа
1 parent eaa900a commit f47bbf8

File tree

2 files changed

+83
-1
lines changed

2 files changed

+83
-1
lines changed

dba/DBA.md

Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -546,6 +546,13 @@ SELECT pg_reload_conf();
546546

547547
<b>Выполнение всех описанных выше периодических задач обслуживания берет на себя фоновый процесс автоочистки (autovacuum).</b>
548548

549+
Очистки требуют объекты, в которых накопилось значительное количество ненужных ("мертвых") версий строк. Очищаются также объекты, в которые с момента прошлой очистки было вставлено значительное количество новых строк. Это важно для таблиц, в которые данные только вставляются: их тоже необходимо очищать, чтобы обновить карту видимости и заморозить старые версии.
550+
551+
В случае необходимости можно настроить параметры очистки на уровне отдельных таблиц с помощью параметров хранения:
552+
```sql
553+
CREATE TABLE ... WITH (параметр=значение);
554+
```
555+
549556
В системе постоянно присутствует процесс `autovacuum launcher`, который планирует работу очистки и запускает необходимое число рабочих процессов `autovacuum worker`, работающих параллельно. Очистка работает постранично, не приводя к блокировкам других транзакций, хотя и создает нагрузку на подсистему ввода-вывода.
550557

551558
Автоматическая очистка перестанет работать при отключении любого из двух параметров `autovacuum` или `track_counts`. Может ошибочно показаться, что отключение способно увеличить производительность системы за счет исключения "лишних" операций ввода-вывода. На самом деле отказ от очистки влечет за собой последствия: неконтролируемое разрастание файлов, замедление запросов и риск аварийной остановки сервера. В конечном итоге это приведет к полному параличу системы.
@@ -570,6 +577,58 @@ FROM pg_stat_activity
570577
WHERE backend_type = 'autovacuum launcher';
571578
```
572579

580+
Представление, показывающее, нужна ли таблице очистка:
581+
```sql
582+
CREATE VIEW needed_vacuum AS
583+
WITH params AS (
584+
SELECT (SELECT setting::INT
585+
FROM pg_settings
586+
WHERE name = 'autovacuum_vacuum_threshold') AS vacuum_threshold,
587+
(SELECT setting::FLOAT
588+
FROM pg_settings
589+
WHERE name = 'autovacuum_vacuum_scale_factor') AS vacuum_scale_factor
590+
)
591+
SELECT st.relname,
592+
st.n_dead_tup dead_tup,
593+
(p.vacuum_threshold + p.vacuum_scale_factor*c.reltuples)::INT max_dead_tup,
594+
st.n_dead_tup > (p.vacuum_threshold + p.vacuum_scale_factor*c.reltuples)::INT need_vacuum,
595+
st.last_autovacuum
596+
FROM pg_stat_all_tables st,
597+
pg_class c,
598+
params p
599+
WHERE c.oid = st.relid
600+
AND c.relname = '<таблица>';
601+
```
602+
603+
Аналогичное представление на определение необходимости анализа:
604+
```sql
605+
CREATE VIEW needed_analyze AS
606+
WITH params AS (
607+
SELECT (SELECT setting::INT
608+
FROM pg_settings
609+
WHERE name = 'autovacuum_analyze_threshold') as analyze_threshold,
610+
(SELECT setting::FLOAT
611+
FROM pg_settings
612+
WHERE name = 'autovacuum_analyze_scale_factor') as analyze_scale_factor
613+
)
614+
SELECT st.relname,
615+
st.n_mod_since_analyze mod_tup,
616+
(p.analyze_threshold + p.analyze_scale_factor*c.reltuples)::INT max_mod_tup,
617+
st.n_mod_since_analyze > (p.analyze_threshold + p.analyze_scale_factor*c.reltuples)::INT need_analyze,
618+
st.last_autoanalyze
619+
FROM pg_stat_all_tables st,
620+
pg_class c,
621+
params p
622+
WHERE c.oid = st.relid
623+
AND c.relname = '<таблица>';
624+
```
625+
626+
Основные параметры настройки автоочистки:
627+
* `autovacuum_vacuum_scale_factor` — частота обработки
628+
* `autovacuum_max_workers` — параллелизм
629+
* `autovacuum_vacuum_cost_limit` — скорость работы
630+
631+
573632

574633
### Табличные пространства
575634

dev/QPT.md

Lines changed: 24 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -825,4 +825,27 @@ Time: 7654,217 ms (00:07,654)
825825
* Нормализация/денормализация схемы (устранение/привнесение избыточности данных)
826826
* Разумное ограничение целостности данных (установка constraints)
827827
* Материализация CTE и VIEW
828-
* Изменение структуры запроса (разные решения могут иметь разную производительность)
828+
* Изменение структуры запроса (разные решения могут иметь разную производительность)
829+
830+
831+
### Поиск и исправление длительного запроса
832+
833+
1. Просмотреть ТОП-5 самых длительных запросов в системе:
834+
```sql
835+
SELECT query, calls, total_exec_time, rows
836+
FROM pg_stat_statements
837+
ORDER BY total_exec_time DESC
838+
LIMIT 5;
839+
```
840+
841+
2. Проанализировать `EXPLAIN ANALYZE` на предмет наличия последовательного сканиования;
842+
843+
ТОП-5 таблиц, по которым проходило последовательное сканирование:
844+
```sql
845+
SELECT schemaname, relname, seq_scan, seq_tup_read, seq_tup_read / seq_scan as avg_seq_tup_read
846+
FROM pg_stat_all_tables
847+
WHERE seq_scan > 0
848+
ORDER BY 5 DESC LIMIT 5;
849+
```
850+
851+
3. добавить индексы.

0 commit comments

Comments
 (0)