

- Главная
- Каталог
- Интернет технологии
- Postgres Guru | Базы данных
Postgres Guru | Базы данных
Технические статьи, инструкции, новости и юмор из мира СУБД PostgreSQL и языка запросов SQL.
Статистика канала
Полная статистикаchevron_rightSET pg_statement_rollback.enabled TO off;
pg_statement_rollback.savepoint_name - имя точки сохранения (по-умолчанию PgSLRAutoSvpt). Этот параметр может быть установлен только суперпользователем.
pg_statement_rollback.enable_writeonly
По умолчанию расширение не создает автоматические точки сохранения после операторов SELECT. Это сделано для ограничения количества точек сохранения, чтобы избежать переполнения кэша подтранзакций. Это поведение можно отключить без потери производительности, если у вас меньше 64 (PGPROC_MAX_CACHED_SUBXIDS) операторов в транзакции. В противном случае вы столкнетесь с потерей производительности из-за сканирования pg_subtrans на диске.
Во всех сеансах, где вы хотите использовать транзакции с откатом на уровне оператора от pg_statement_rollback, вам нужно загрузить расширение с помощью:
LOAD 'pg_statement_rollback.so';
SET pg_statement_rollback.enabled TO on;
Затем в вашем приложении, когда возникает ошибка, вам нужно будет вызвать
ROLLBACK TO SAVEPOINT "PgSLRAutoSvpt";
чтобы продолжить выполнение текущей транзакции с состояния непосредственно перед ошибкой.
Если вы хотите использовать расширение на уровне всего кластера PostgreSQL, то добавьте его в postgresql.conf вот так:
session_preload_libraries = 'pg_statement_rollback'
и включите расширение
pg_statement_rollback.enabled = on
Совместно с этим расширением можно использовать расширение pg_dbms_errlog. Официальный GitHub:
➡️ https://github.com/HexaCluster/pg_dbms_errlog
Это расширение позволяет логировать сбойные SQL операторы внутри транзакции.
На этом все! До связи!
#pgextSELECT name FROM pg_stat_slru;
Чтобы понять, создает ли наша система SLRU для MultiXact, мы можем запросить все колонки представления pg_stat_slru. Мы увидим ненулевые числа в строках в результате запроса, когда система создает данные SLRU.
SELECT * FROM pg_stat_slru;
Hit и read относятся к чтениям из SLRU: когда нужные страницы уже находились в SLRU (hit) или нет (read).
Когда новые страницы выделяются, мы видим это в blks_zeroed, так как они записываются, заполненные нулями.
Когда новые страницы записываются (blks_written) в SLRU, это создает "грязные" (dirtied) страницы, которые в конечном итоге будут сброшены на диск (flushes).
SLRU также могут усекаться (счетчик Truncates).
Что может пойти не так с SLRU и Xact?
SLRU используют 32-битные номера, и для высоконагруженной базы PostgreSQL они могут быстро закончится и случится Wrap-around 😱.
Такое может случиться в двух случаях:
1️⃣ Переполнение подтранзакций (Subtransactions overflow): Использование подтранзакций создает идентификатор для отслеживания каждой из них. При достаточно высокой скорости создания возможно исчерпание доступных значений;
2️⃣ Исчерпание пространства членов MultiXact (MultiXact member space exhaustion).
В Postgres 17 пространство для членов и смещений (member and offset) MultiXact теперь можно настраивать за пределами начального размера по умолчанию. Единица измерения — количество 8-килобайтных страниц. Для этого у нас появилось два новых параметра:
multixact_member_buffers, по умолчанию 32 страницы по 8 КБ;
multixact_offset_buffers, по умолчанию 16 страниц по 8 КБ.
Какие выводы из всего этого можно сделать? Если у вас очень высоконагруженная база данных PostgreSQL, в которой много и часто порождаются MultiXact, вы просто обязаны о них знать и приглядывать за ними, чтобы избежать возможных проблем в будущем. Так что, мониторинг наше все! ☺️
На этом все! До связи!
#pgbase #pgmonitorSELECT pg_current_xact_id();.
MultiXact создаются только для определенных типов операций DML и для отдельных определений схемы. Другими словами, возможно, что ваша конкретная рабочая нагрузка в базе вообще не создаст MultiXact, или наоборот, они могут интенсивно использоваться.
К созданию MultiXact приводит:
✅ Принудительное соблюдение ограничений внешнего ключа (Foreign key constraint enforcement);
✅ SELECT FOR SHARE.
Если вы не используете ограничения внешних ключей или ваше приложение никогда не создает блокировки SELECT FOR SHARE, то в вашей базе данных Postgres может не быть MultiXact вообще.
SLRU имеют фиксированный размер (до версии Postgres 17), измеряемый в страницах. Когда элементы вытесняются из кеша SLRU, происходит замена страницы.
Заменяемая страница называется "жертвенной" (victim page), и Postgres должен выполнить небольшую работу, чтобы найти такую страницу. Поскольку SLRU сохраняются при перезапуске службы PostgreSQL, они сохраняются в файлах в каталоге PGDATA.
Имя каталога зависит от типа SLRU. Например, для MultiXact имя каталога — pg_multixact. Страницы буферов SLRU записываются в WAL и на диск.
Каждый экземпляр SLRU реализует циклический буфер страниц в общей памяти, вытесняя наименее недавно использовавшиеся страницы.
С теоретической частью все. В следующих постах рассмотрим возможные сбои, связанные с MultiXact и средства мониторинга.
На этом все! До связи!
#pgbaseВ предверии выхода 18-й версии PostgreSQL (25.09.2025), посмотрим на ее ключевое нововведение - Асинхронный I/O, которое обещает кардинально улучшить производительность на высоконагруженных системах.
Что такое асинхронный I/O и почему это важно?
Чтобы понять значимость этой функции, давайте разберемся в основе проблемы.
Синхронный I/O (как работало раньше): Когда процессу PostgreSQL (например, backend, выполняющему ваш SQL-запрос) нужно прочитать данные с диска (страницу из таблицы или индекса), он инициирует операцию чтения и блокируется, ожидая ее завершения. Процесс просто "спит", пока аппаратное обеспечение (диск, SSD) не выполнит запрос и не вернет данные. Только получив данные, процесс может продолжить свою работу. Аналогично, хотя и с нюансами, могла работать и запись. Это простое и надежное решение, но на быстрых NVMe SSD процессор может простаивать в ожидании, тратя драгоценное время на простои.
Асинхронный I/O (как работает теперь): Процесс инициирует операцию чтения и немедленно возвращается к выполнению другой полезной работы. Он не блокируется. Когда операция ввода-вывода завершается, ядро ОС уведомляет процесс, и тот обрабатывает результат. Это позволяет максимально загрузить процессор и параллельно обрабатывать множество запросов к диску.
Как реализован асинхронный I/O в PostgreSQL 18?
Важно отметить, что операции записи все равно останутся синхронными, это необходимо для обеспечения принципов ACID транзакций.
1️⃣ Низкоуровневая интеграция: Разработчики сообщества PostgreSQL, в частности Андрес Фройнд, проделали огромную работу по интеграции механизма io_uring (для Linux) и POSIX AIO (для других UNIX-систем) непосредственно в движок базы данных. Раньше PostgreSQL эмулировал асинхронность с помощью пулов процессов, но это было не истинно асинхронно.
2️⃣ io_uring: На системах Linux 5.1+ используется современный и высокопроизводительный интерфейс io_uring, который позволяет с минимальными накладными расходами ставить в очередь десятки тысяч операций ввода-вывода и эффективно обрабатывать их завершение. По-умолчанию настройка будет io_method = worker, но если ваша ОС позволяет использовать io_ring, то лучше использовать его;
3️⃣ Прозрачность для пользователя: вам, администратору, не нужно переписывать запросы или приложения. СУБД автоматически начинает использовать AIO для фоновых процессов, таких как:
✅ CHECKPOINT (очень важная операция, записывающая "грязные" буферы на диск)
✅ Фоновый writer (Background Writer)
✅ Автоочистка (AutoVacuum)
✅ А также для операций чтения/записи пользовательских процессов.
Какие преимущества это дает?
1️⃣ Значительный рост производительности на быстрых дисках (NVMe): На современных SSD, особенно NVMe, где задержки измеряются микросекундами, накладные расходы на синхронные ожидания становятся очень заметными;
2️⃣ Снижение задержек (Latency) и увеличение пропускной способности (Throughput);
3️⃣ Более эффективный CHECKPOINT: Эта критически важная операция теперь будет выполняться гораздо менее болезненно для основной нагрузки, так как запись будет происходить асинхронно, не заставляя процессы надолго блокироваться в ожидании.
4️⃣ Улучшение масштабируемости: Система будет лучше масштабироваться на многоядерных серверах, так как потоки и процессы будут меньше времени тратить на ожидание I/O и больше на полезную работу.
Ограничения и требования
✅ Поддержка ОС: Для работы в полную силу требуется современное ядро Linux (поддерживающее io_uring) или другая ОС с поддержкой POSIX AIO;
✅ Тип нагрузки: Наибольшую выгоду получат workloads, интенсивно работающие с диском. Для баз данных, которые полностью помещаются в кэш shared_buffers (в оперативной памяти), прирост может быть не так заметен;
✅ Это все еще развивающаяся функция: В первом релизе (PostgreSQL 18) асинхронный I/O, скорее всего, будет включен не для всех операций, а в первую очередь для фоновых процессов.
#pgnews
UPDATE fruit
SET quantity = 300
WHERE item = 'Apples'
RETURNING OLD.*, NEW.*;
Вывод:
id|item|quantity|id|item|quantity
——+—-——+————————+——+———+——————
5|Apples| 200 | 5| Apples |300
(1 row)
Получается очень просто, удобно и наглядно! Все как мы любим! ☺️
Вот еще пример.
Допустим, мы выполняем операцию UPSERT (INSERT ... ON CONFLICT ... DO UPDATE) и хотим определить, была ли строка, возвращённая RETURNING, новой вставленной строкой или существующей обновлённой строкой. Это было возможно и раньше, но полагалось на неинтуитивную проверку xmax = 0:
INSERT INTO webhook (
id,
data
) VALUES (
@id,
@data
)
ON CONFLICT (id)
DO UPDATE SET id = webhook.id
RETURNING webhook.*,
(xmax = 0) AS is_new;
Этот оператор полагается на то, что xmax устанавливается в ноль для новой вставки, что является особенностью реализации блокировок в PostgreSQL. Это работает, но не является гарантированной частью API и потенциально может измениться в любой момент.
В PostgreSQL 18 мы можем переписать приведённый выше код так, чтобы он был более понятным и не зависел от деталей реализации. Это также просто - достаточно проверить, является ли OLD значением NULL в предложении RETURNING:
INSERT INTO webhook (
id,
data
) VALUES (
@id,
@data
)
ON CONFLICT (id)
DO UPDATE SET id = webhook.id
RETURNING webhook.*,
(OLD IS NULL)::boolean AS is_new;
Доступ к OLD и NEW, без сомнения, найдёт множество других полезных применений, но этот пример позволяет нам сразу же улучшить код, написанный до 18-й версии.
Переходим на PostgreSQL 18 и пользуемся! ☺️
#pgnews #pgbaseОтзывы канала
всего 6 отзывов
- Добавлен: Сначала новые
- Добавлен: Сначала старые
- Оценка: По убыванию
- Оценка: По возрастанию
Каталог Телеграм-каналов для нативных размещений
Postgres Guru | Базы данных — это Telegam канал в категории «Интернет технологии», который предлагает эффективные форматы для размещения рекламных постов в Телеграмме. Количество подписчиков канала в 2.8K и качественный контент помогают брендам привлекать внимание аудитории и увеличивать охват. Рейтинг канала составляет 20.4, количество отзывов – 6, со средней оценкой 5.0.
Вы можете запустить рекламную кампанию через сервис Telega.in, выбрав удобный формат размещения. Платформа обеспечивает прозрачные условия сотрудничества и предоставляет детальную аналитику. Стоимость размещения составляет 2797.2 ₽, а за 45 выполненных заявок канал зарекомендовал себя как надежный партнер для рекламы в TG. Размещайте интеграции уже сегодня и привлекайте новых клиентов вместе с Telega.in!
Вы снова сможете добавить каналы в корзину из каталога
Комментарий