Обновление
This commit is contained in:
parent
8b4fb13112
commit
516c330dc2
31
dev/database/postgresql/Autovacuum.md
Normal file
31
dev/database/postgresql/Autovacuum.md
Normal 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) -->
|
||||||
|
|
@ -12,7 +12,7 @@ date: 2024-06-17
|
|||||||
- **Проблемы с сетью**: задержка в сети или потеря пакетов могут замедлять передачу данных между клиентом и сервером. Убедитесь в стабильности соединения.
|
- **Проблемы с сетью**: задержка в сети или потеря пакетов могут замедлять передачу данных между клиентом и сервером. Убедитесь в стабильности соединения.
|
||||||
- **Настройки базы данных**:
|
- **Настройки базы данных**:
|
||||||
- Если у вас много соединений, используйте [[PgBouncer]], чтобы разгрузить управление соединениями.
|
- Если у вас много соединений, используйте [[PgBouncer]], чтобы разгрузить управление соединениями.
|
||||||
- Проверьте, что `autovacuum` включен и настроен, чтобы избежать накопления "мусорных" строк, которые могут замедлить работу БД.
|
- Проверьте, что [[autovacuum]] включен и настроен, чтобы избежать накопления "мусорных" строк, которые могут замедлить работу БД.
|
||||||
- Анализ и выбор [[../Плохой SQL запрос|проблемных запросов]]
|
- Анализ и выбор [[../Плохой SQL запрос|проблемных запросов]]
|
||||||
- Оптимизировать все запросы подряд неэффективно. Начните с самых проблемных, чтобы добиться наибольшего улучшения.
|
- Оптимизировать все запросы подряд неэффективно. Начните с самых проблемных, чтобы добиться наибольшего улучшения.
|
||||||
- **Анализ проводите только на продуктовой БД**, так как тестовые среды могут не отражать реальную нагрузку.
|
- **Анализ проводите только на продуктовой БД**, так как тестовые среды могут не отражать реальную нагрузку.
|
||||||
|
44
dev/database/postgresql/Раздутие таблиц.md
Normal file
44
dev/database/postgresql/Раздутие таблиц.md
Normal 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) -->
|
||||||
|
|
@ -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]]
|
||||||
|
35
dev/database/Долгая транзакция.md
Normal file
35
dev/database/Долгая транзакция.md
Normal 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) -->
|
||||||
|
|
40
dev/Побочные действия.md
Normal file
40
dev/Побочные действия.md
Normal 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) -->
|
||||||
|
|
@ -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]]
|
||||||
|
@ -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 пишет на диск в два места – в хранилище данных и в журнал.
|
||||||
|
Loading…
Reference in New Issue
Block a user