Обновление
Some checks reported errors
continuous-integration/drone/push Build was killed
continuous-integration/drone Build is failing

This commit is contained in:
Struchkov Mark 2024-11-08 23:37:40 +03:00
parent 8b4fb13112
commit 516c330dc2
No known key found for this signature in database
GPG Key ID: A3F0AC3F0FA52F3C
8 changed files with 157 additions and 1 deletions

View File

@ -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]]
**Автор**::
### Дополнительные материалы
-
### Дочерние заметки
<!-- QueryToSerialize: LIST FROM [[]] WHERE contains(Родитель, this.file.link) or contains(parents, this.file.link) -->

View File

@ -12,7 +12,7 @@ date: 2024-06-17
- **Проблемы с сетью**: задержка в сети или потеря пакетов могут замедлять передачу данных между клиентом и сервером. Убедитесь в стабильности соединения. - **Проблемы с сетью**: задержка в сети или потеря пакетов могут замедлять передачу данных между клиентом и сервером. Убедитесь в стабильности соединения.
- **Настройки базы данных**: - **Настройки базы данных**:
- Если у вас много соединений, используйте [[PgBouncer]], чтобы разгрузить управление соединениями. - Если у вас много соединений, используйте [[PgBouncer]], чтобы разгрузить управление соединениями.
- Проверьте, что `autovacuum` включен и настроен, чтобы избежать накопления "мусорных" строк, которые могут замедлить работу БД. - Проверьте, что [[autovacuum]] включен и настроен, чтобы избежать накопления "мусорных" строк, которые могут замедлить работу БД.
- Анализ и выбор [[../Плохой SQL запрос|проблемных запросов]] - Анализ и выбор [[../Плохой SQL запрос|проблемных запросов]]
- Оптимизировать все запросы подряд неэффективно. Начните с самых проблемных, чтобы добиться наибольшего улучшения. - Оптимизировать все запросы подряд неэффективно. Начните с самых проблемных, чтобы добиться наибольшего улучшения.
- **Анализ проводите только на продуктовой БД**, так как тестовые среды могут не отражать реальную нагрузку. - **Анализ проводите только на продуктовой БД**, так как тестовые среды могут не отражать реальную нагрузку.

View File

@ -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]]
**Автор**::
### Дополнительные материалы
-
### Дочерние заметки
<!-- QueryToSerialize: LIST FROM [[]] WHERE contains(Родитель, this.file.link) or contains(parents, this.file.link) -->

View File

@ -9,6 +9,8 @@ date: 2024-11-04
Таблица - это гомогенное множество кортежей. Таблица - это гомогенное множество кортежей.
Таблица разбивается на [[../DB page|страницы]]. Таблица разбивается на [[../DB page|страницы]].
В PostgreSQL удаленные или обновленные строки не очищаются немедленно; вместо этого они остаются в таблице до следующей очистки. Это оставляет “пустоты”, которые увеличивают физический объем базы данных, хотя в них уже нет полезной информации. - [[Раздутие таблиц]] ^71df9c
*** ***
## Мета информация ## Мета информация
**Область**:: [[../../../meta/zero/00 PostgreSQL|00 PostgreSQL]] **Область**:: [[../../../meta/zero/00 PostgreSQL|00 PostgreSQL]]

View File

@ -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]]
**Автор**::
### Дополнительные материалы
-
### Дочерние заметки
<!-- QueryToSerialize: LIST FROM [[]] WHERE contains(Родитель, this.file.link) or contains(parents, this.file.link) -->

View File

@ -0,0 +1,40 @@
---
aliases:
- side effects
tags:
- maturity/🌱
date: 2024-11-08
---
Побочные действия в коде — это любые операции, которые изменяют состояние за пределами самой функции. Это может быть:
- изменение внешних переменных;
- модификация содержимого коллекций, находящихся вне функции;
- операции с файловой системой или базами данных;
- взаимодействие с сетью и другие внешние взаимодействия.
Такие действия могут сделать код менее предсказуемым и сложным в отладке, так как результат работы функции может зависеть от внешнего состояния, которое не всегда явно.
## Примеры побочных действий в Java
### Изменение внешней коллекции с использованием forEach
```java
List<String> names = Arrays.asList("Alice", "Bob", "Charlie");
List<String> upperCaseNames = new ArrayList<>();
// Побочный эффект: добавление элементов во внешнюю коллекцию
names.forEach(name -> upperCaseNames.add(name.toUpperCase()));
```
В этом примере метод forEach используется для преобразования имен в верхний регистр и добавления их в `upperCaseNames`. Это создает зависимость от внешней переменной `upperCaseNames`, что является побочным действием.
***
## Мета информация
**Область**:: [[../meta/zero/00 Разработка|00 Разработка]]
**Родитель**::
**Источник**::
**Создана**:: [[2024-11-08]]
**Автор**::
### Дополнительные материалы
-
### Дочерние заметки
<!-- QueryToSerialize: LIST FROM [[]] WHERE contains(Родитель, this.file.link) or contains(parents, this.file.link) -->

View File

@ -4,6 +4,7 @@ tags:
- maturity/🌱 - maturity/🌱
date: 2024-11-05 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]]. (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]]. (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]] - [[2024-11-05]]. (6/10) [[../source/lecture/Доклад. Могут ли Virtual threads заменить Webflux|Доклад. Могут ли Virtual threads заменить Webflux]]

View File

@ -13,6 +13,9 @@ title: PostgreSQL
- [Репликация в PostgreSQL](../../dev/database/postgresql/Репликация%20в%20PostgreSQL.md) - [Репликация в PostgreSQL](../../dev/database/postgresql/Репликация%20в%20PostgreSQL.md)
- [Бэкап в PostgreSQL](Бэкап%20в%20PostgreSQL.md) - [Бэкап в PostgreSQL](Бэкап%20в%20PostgreSQL.md)
- [Профилирование запросов в PostgreSQL](../../dev/database/postgresql/Профилирование%20запросов%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 пишет на диск в два места в хранилище данных и в журнал. - PostgreSQL пишет на диск в два места в хранилище данных и в журнал.