From 516c330dc23092efb6aad71aac0b09a239029962 Mon Sep 17 00:00:00 2001 From: Struchkov Mark Date: Fri, 8 Nov 2024 23:37:40 +0300 Subject: [PATCH] =?UTF-8?q?=D0=9E=D0=B1=D0=BD=D0=BE=D0=B2=D0=BB=D0=B5?= =?UTF-8?q?=D0=BD=D0=B8=D0=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- dev/database/postgresql/Autovacuum.md | 31 +++++++++++++ .../Оптимизация SQL запросов в PostgreSQL.md | 2 +- dev/database/postgresql/Раздутие таблиц.md | 44 +++++++++++++++++++ .../postgresql/Таблица в PostgreSQL.md | 2 + dev/database/Долгая транзакция.md | 35 +++++++++++++++ dev/Побочные действия.md | 40 +++++++++++++++++ dev/Посмотренные доклады по разработке.md | 1 + meta/zero/00 PostgreSQL.md | 3 ++ 8 files changed, 157 insertions(+), 1 deletion(-) create mode 100644 dev/database/postgresql/Autovacuum.md create mode 100644 dev/database/postgresql/Раздутие таблиц.md create mode 100644 dev/database/Долгая транзакция.md create mode 100644 dev/Побочные действия.md diff --git a/dev/database/postgresql/Autovacuum.md b/dev/database/postgresql/Autovacuum.md new file mode 100644 index 00000000..5e7ef726 --- /dev/null +++ b/dev/database/postgresql/Autovacuum.md @@ -0,0 +1,31 @@ +--- +aliases: +tags: + - maturity/🌱 +date: 2024-11-05 +--- +## Тезисы +- Autovacuum — это автоматический процесс в PostgreSQL, поддерживающий производительность базы данных. +- Основные задачи: предотвращение раздутия таблиц, освобождение неактуальных строк, обновление статистики. +*** +Autovacuum — это встроенный процесс в [[../../../meta/zero/00 PostgreSQL|PostgreSQL]], автоматически выполняющий задачи очистки и обновления данных в базе. Его цель — минимизировать проблему “раздутия” ([[Раздутие таблиц|bloat]]) таблиц, возникающую при удалении или обновлении строк. Когда строка становится неактуальной, она остается в физической структуре таблицы и занимает место, пока Autovacuum не удалит ее, освобождая ресурсы. + +Autovacuum выполняет три ключевые задачи: +1. **Удаление неактуальных строк**: после обновлений и удалений строки не удаляются физически, а остаются, что приводит к избыточному использованию памяти. Autovacuum очищает такие строки. +2. **Обновление статистики**: PostgreSQL использует статистику для оптимизации выполнения запросов. Autovacuum обновляет статистику, что помогает планировщику запросов выбирать оптимальные пути + +Проблемы: +- [[../Долгая транзакция|Долгая транзакция]] +*** +## Мета информация +**Область**:: [[../../../meta/zero/00 PostgreSQL|00 PostgreSQL]] +**Родитель**:: +**Источник**:: +**Создана**:: [[2024-11-05]] +**Автор**:: +### Дополнительные материалы +- + +### Дочерние заметки + + diff --git a/dev/database/postgresql/Оптимизация SQL запросов в PostgreSQL.md b/dev/database/postgresql/Оптимизация SQL запросов в PostgreSQL.md index 932dad7d..55e34436 100644 --- a/dev/database/postgresql/Оптимизация SQL запросов в PostgreSQL.md +++ b/dev/database/postgresql/Оптимизация SQL запросов в PostgreSQL.md @@ -12,7 +12,7 @@ date: 2024-06-17 - **Проблемы с сетью**: задержка в сети или потеря пакетов могут замедлять передачу данных между клиентом и сервером. Убедитесь в стабильности соединения. - **Настройки базы данных**: - Если у вас много соединений, используйте [[PgBouncer]], чтобы разгрузить управление соединениями. - - Проверьте, что `autovacuum` включен и настроен, чтобы избежать накопления "мусорных" строк, которые могут замедлить работу БД. + - Проверьте, что [[autovacuum]] включен и настроен, чтобы избежать накопления "мусорных" строк, которые могут замедлить работу БД. - Анализ и выбор [[../Плохой SQL запрос|проблемных запросов]] - Оптимизировать все запросы подряд неэффективно. Начните с самых проблемных, чтобы добиться наибольшего улучшения. - **Анализ проводите только на продуктовой БД**, так как тестовые среды могут не отражать реальную нагрузку. diff --git a/dev/database/postgresql/Раздутие таблиц.md b/dev/database/postgresql/Раздутие таблиц.md new file mode 100644 index 00000000..66217842 --- /dev/null +++ b/dev/database/postgresql/Раздутие таблиц.md @@ -0,0 +1,44 @@ +--- +aliases: + - bloat +tags: + - maturity/🌱 +date: 2024-11-05 +--- +## Тезисы +- “Раздутие” (bloat) — это проблема неиспользуемого, но занятого пространства в таблицах базы данных. +- Основные причины: удаление и обновление строк, которые оставляют физическое пространство занятым. +- Проблема приводит к увеличению объема базы, снижению производительности и повышению требований к ресурсам. +- Для борьбы с bloat применяют Autovacuum, ручной Vacuum и вакуумирование с полной переорганизацией (VACUUM FULL). +*** +“Раздутие” (bloat) таблиц — это накопление неиспользуемого, но занятого пространства в структуре таблиц базы данных. Такая ситуация возникает, когда строки удаляются или обновляются. + +![[Таблица в PostgreSQL#^71df9c]] + + +**Основные причины раздутия**: +1. **Удаление строк**: При удалении строки данные физически остаются в таблице, занимая место. +2. **Обновление строк**: PostgreSQL создает новую версию строки для обновленных данных, сохраняя старую версию для обеспечения транзакционной целостности, что также добавляет лишние данные. + +**Последствия раздутия**: +- **Рост объема данных**: Таблицы и индексы могут существенно увеличиваться в объеме, требуя больше места на диске. +- **Снижение производительности**: Чем больше размер таблицы, тем медленнее будут выполняться запросы. Это связано с тем, что сервер вынужден обрабатывать неактуальные данные. +- **Увеличение использования ресурсов**: Дополнительные данные влияют на объем памяти и нагрузку на процессор, что может замедлить систему. + +**Методы борьбы с bloat**: +1. **Autovacuum**: В PostgreSQL есть автоматический процесс [[Autovacuum]], который регулярно удаляет неактуальные строки, чтобы уменьшить bloat. Однако его настройка требует внимания, так как высокая частота работы Autovacuum может создавать нагрузку на производительность, а слишком редкая настройка может не справляться с накоплением пустот. +2. **Ручной VACUUM**: В случае значительного bloat можно запускать команду `VACUUM` вручную, чтобы освободить неиспользуемое пространство. Такой подход полезен для интенсивных таблиц, где Autovacuum не всегда справляется. +3. **VACUUM FULL**: Для полного устранения bloat иногда требуется вакуумирование с полной переорганизацией, то есть VACUUM FULL. Эта операция пересоздает таблицу, удаляя все неиспользуемое пространство, но требует блокировки таблицы на время выполнения, что может прерывать работу пользователей. +*** +## Мета информация +**Область**:: [[../../../meta/zero/00 PostgreSQL|00 PostgreSQL]] +**Родитель**:: +**Источник**:: +**Создана**:: [[2024-11-05]] +**Автор**:: +### Дополнительные материалы +- + +### Дочерние заметки + + diff --git a/dev/database/postgresql/Таблица в PostgreSQL.md b/dev/database/postgresql/Таблица в PostgreSQL.md index de3e40f6..8abff18f 100644 --- a/dev/database/postgresql/Таблица в PostgreSQL.md +++ b/dev/database/postgresql/Таблица в PostgreSQL.md @@ -9,6 +9,8 @@ date: 2024-11-04 Таблица - это гомогенное множество кортежей. Таблица разбивается на [[../DB page|страницы]]. + +В PostgreSQL удаленные или обновленные строки не очищаются немедленно; вместо этого они остаются в таблице до следующей очистки. Это оставляет “пустоты”, которые увеличивают физический объем базы данных, хотя в них уже нет полезной информации. - [[Раздутие таблиц]] ^71df9c *** ## Мета информация **Область**:: [[../../../meta/zero/00 PostgreSQL|00 PostgreSQL]] diff --git a/dev/database/Долгая транзакция.md b/dev/database/Долгая транзакция.md new file mode 100644 index 00000000..53ea0edb --- /dev/null +++ b/dev/database/Долгая транзакция.md @@ -0,0 +1,35 @@ +--- +aliases: +tags: + - maturity/🌱 +date: 2024-11-05 +--- +## Тезисы +- Долгая транзакция — это незавершенная транзакция, которая может удерживать старую точку восстановления и препятствовать работе Autovacuum. +- Проблемы, вызванные долгими транзакциями: блокировка данных, нарушение процесса очистки таблиц, увеличение объема данных. +- Причины: ошибки в приложении, не обработанные исключения, человеческий фактор. +- Рекомендации: мониторинг и внешняя автоматизация завершения долгих транзакций. +*** +**Долгая транзакция** — это транзакция, которая была начата, но не завершена, и остается открытой, даже если в данный момент не выполняет действий. Такая транзакция удерживает точку восстановления (oldest transaction ID), что приводит к тому, что PostgreSQL должен хранить данные для поддержания целостности состояния на момент её открытия. Это удерживание мешает процессу [[postgresql/Autovacuum|Autovacuum]] очищать неактуальные строки, так как они могут быть необходимы для поддержания целостности базы в случае завершения этой старой транзакции. + +**Причины появления долгих транзакций** +1. **Внешний вызов**: В рамках транзакции в базе данных выполняется вызов внешнего процесса, который завершается с ошибкой, оставляя транзакцию открытой. +2. **Отсутствие обработки ошибок**: Если приложение не обрабатывает исключения, возникшие в ходе выполнения логики внутри транзакции, это может оставить транзакцию незавершенной. +3. **Человеческий фактор**: Открыли транзакции вручную через консоль и забыли её завершить. + +**Как решать проблему долгих транзакций?** +1. **Настройка мониторинга и алертов**: Настройте мониторинг и установите порог длительности транзакции, после которого её продолжительное существование вызывает оповещение. В большинстве продакшн-систем это время обычно составляет 1 час или меньше. +2. **Автоматическое завершение долгих транзакций**. +*** +## Мета информация +**Область**:: [[../../meta/zero/00 Базы Данных|00 Базы Данных]] +**Родитель**:: [[Транзакция БД]] +**Источник**:: +**Создана**:: [[2024-11-05]] +**Автор**:: +### Дополнительные материалы +- + +### Дочерние заметки + + diff --git a/dev/Побочные действия.md b/dev/Побочные действия.md new file mode 100644 index 00000000..5b0c1437 --- /dev/null +++ b/dev/Побочные действия.md @@ -0,0 +1,40 @@ +--- +aliases: + - side effects +tags: + - maturity/🌱 +date: 2024-11-08 +--- +Побочные действия в коде — это любые операции, которые изменяют состояние за пределами самой функции. Это может быть: +- изменение внешних переменных; +- модификация содержимого коллекций, находящихся вне функции; +- операции с файловой системой или базами данных; +- взаимодействие с сетью и другие внешние взаимодействия. + +Такие действия могут сделать код менее предсказуемым и сложным в отладке, так как результат работы функции может зависеть от внешнего состояния, которое не всегда явно. +## Примеры побочных действий в Java +### Изменение внешней коллекции с использованием forEach + +```java +List names = Arrays.asList("Alice", "Bob", "Charlie"); +List upperCaseNames = new ArrayList<>(); + +// Побочный эффект: добавление элементов во внешнюю коллекцию +names.forEach(name -> upperCaseNames.add(name.toUpperCase())); +``` + +В этом примере метод forEach используется для преобразования имен в верхний регистр и добавления их в `upperCaseNames`. Это создает зависимость от внешней переменной `upperCaseNames`, что является побочным действием. + +*** +## Мета информация +**Область**:: [[../meta/zero/00 Разработка|00 Разработка]] +**Родитель**:: +**Источник**:: +**Создана**:: [[2024-11-08]] +**Автор**:: +### Дополнительные материалы +- + +### Дочерние заметки + + diff --git a/dev/Посмотренные доклады по разработке.md b/dev/Посмотренные доклады по разработке.md index 6519eff7..9fde8636 100644 --- a/dev/Посмотренные доклады по разработке.md +++ b/dev/Посмотренные доклады по разработке.md @@ -4,6 +4,7 @@ tags: - maturity/🌱 date: 2024-11-05 --- +- [[2024-11-05]]. (4/10) [Топ ошибок со стороны разработки при работе с PostgreSQL / Алексей Лесовский (Data Egret) - YouTube](https://www.youtube.com/watch?v=HjLnY0aPQZo&t=17s) - [[2024-11-05]]. (7/10) [Владимир Ситников — B-Tree индексы в базах данных на примере Spring Boot-приложений, PostgreSQL, JPA - YouTube](https://www.youtube.com/watch?v=y-Wtyvme4gE) - [[2024-11-05]]. (8/10) [Владимир Ситников — B-tree индексы в базах данных на примере PostgreSQL - YouTube](https://www.youtube.com/watch?v=mnEU2_cwE_s) - [[2024-11-05]]. (6/10) [[../source/lecture/Доклад. Могут ли Virtual threads заменить Webflux|Доклад. Могут ли Virtual threads заменить Webflux]] diff --git a/meta/zero/00 PostgreSQL.md b/meta/zero/00 PostgreSQL.md index 33b208ca..6b185b7d 100644 --- a/meta/zero/00 PostgreSQL.md +++ b/meta/zero/00 PostgreSQL.md @@ -13,6 +13,9 @@ title: PostgreSQL - [Репликация в PostgreSQL](../../dev/database/postgresql/Репликация%20в%20PostgreSQL.md) - [Бэкап в PostgreSQL](Бэкап%20в%20PostgreSQL.md) - [Профилирование запросов в PostgreSQL](../../dev/database/postgresql/Профилирование%20запросов%20в%20PostgreSQL.md) +- [[../../dev/database/postgresql/Таблица в PostgreSQL|Таблица в PostgreSQL]] + - [[../../dev/database/postgresql/Раздутие таблиц|Раздутие таблиц]] + - [[../../dev/database/postgresql/Autovacuum|Autovacuum]] ## Заметки - PostgreSQL пишет на диск в два места – в хранилище данных и в журнал.