Skip to content

Новости за 2026-09-12 - 2026-09-18

§ Выполнена следующая цепочка переносов:
53 -> 11 -> 3 -> обучающий (167).
Второй этап начинается теперь с задачи №3.
Под номером 53 опубликована новая задача от pegoopik (сложность 3 балла).
Актуализируйте свой сертификат!


§ Популярные темы недели на форуме

Топик		Сообщений	Просмотров
54 (Learn) 3 6
58 (Learn) 2 7
Guest's book 2 8

§ Авторы недели на форуме

Автор		Сообщений
Nividimka 2
selber 2
gennadi_s 2
Продолжить чтение "Новости за 2026-09-12 - 2026-09-18"

Граница вашей транзакции принадлежит программе, а не имени файла

Alexey Evlampiev: Your Transaction Boundary Belongs in the Program, Not the Filename


Поэтапное изменение схемы охватывает транзакционную и нетранзакционную работу. Большинство фреймворков миграций выражают это различие как метаданные, другие делает его частью SQL-программы.

Продолжить чтение "Граница вашей транзакции принадлежит программе, а не имени файла"

Всё о GUC по порядку: idle_in_transaction_session_timeout

Автор Christophe Pettus: All Your GUCs in a Row: idle_in_transaction_session_timeout


idle_in_transaction_session_timeout существует потому, что на код приложения нельзя положиться в том, что он доведёт до конца то, что начал. ORM открывает транзакцию, исключение уводит выполнение по неожиданному пути, соединение возвращается в пул с всё ещё открытой транзакцией, и теперь у PostgreSQL есть сессия, которая будет удерживать всё, к чему прикоснулась, пока кто-нибудь это не заметит. Этот параметр и есть тот самый «кто-нибудь».

Продолжить чтение "Всё о GUC по порядку: idle_in_transaction_session_timeout"

Всё о GUC по порядку: ident_file

Автор Christophe Pettus: All Your GUCs in a Row: ident_file


ident_file сообщает серверу, где находится pg_ident.conf. Вот и вся функция. Интересная часть — это то, что происходит, когда он указан неправильно, а именно: ничего, громко, в журнале, который никто не читает.



Значение по умолчанию — pg_ident.conf в каталоге конфигурации, то есть в каталоге, содержащем postgresql.conf, а не обязательно в каталоге данных. Контекст — postmaster, поэтому для изменения требуется перезапуск, и он несёт флаг «только для суперпользователя», поэтому непривилегированная роль, запрашивающая SHOW ident_file, получает ошибку прав доступа вместо ответа. Относительный путь разрешается относительно рабочего каталога того, кто запустил postgres, а не относительно PGDATA.

Продолжить чтение "Всё о GUC по порядку: ident_file"

Всё о GUC по порядку: hot_standby_feedback

Автор Christophe Pettus: All Your GUCs in a Row: hot_standby_feedback


hot_standby_feedback не устраняет проблему. Он перемещает её — с резервного сервера на первичный, и вопрос о том, является ли это хорошим обменом, — это и есть весь вопрос.


Проблема заключается в конфликтах восстановления, которые отменяют долго выполняющиеся запросы на резервном сервере. Резервный сервер воспроизводит изменения первичного, одновременно отвечая на читающие запросы, и когда первичный очищает vacuum мёртвые версии строк, воспроизведение этой очистки на резервном сервере сталкивается с любым запросом, который всё ещё полагается на эти версии. Резервный сервер разрешает столкновение, убивая запрос, и пользователь видит ERROR: canceling statement due to conflict with recovery. hot_standby_feedback останавливает это, прося первичный сервер вообще не удалять эти строки. Стоимость ложится на первичный сервер в виде раздувания, потому что строки, которые он иначе освободил бы, теперь удерживаются запросом, выполняющимся на другой машине.



Именно поэтому он выключен по умолчанию. Значение по умолчанию подразумевает, что запросы резервного сервера не должны иметь возможности «дотянуться» и ограничивать обслуживание первичного. Его включение — это сознательное решение позволить им это.

Продолжить чтение "Всё о GUC по порядку: hot_standby_feedback"

ALTER TABLE выполняется быстро. Очередь за ним — нет

Автор Alexey Evlampiev: Your ALTER TABLE Is Fast. The Queue Behind It Is Not


Изменение схемы, которое выполняется шесть миллисекунд, всё ещё может остановить каждое чтение из таблицы на шестнадцать секунд — ущерб наносит ожидание, а не работа.


Вот один и тот же оператор, выполненный дважды для одной и той же таблицы — PostgreSQL 16.14 в локальном контейнере, таблица orders на 100 000 строк, конкурирующая сессия удерживается открытой через pg_sleep. Это иллюстративные числа с одной машины, а не бенчмарк; важен сам ratio, и вы можете воспроизвести его примерно за минуту.



-- Без конкуренции:
ALTER TABLE orders ADD COLUMN note text;
Time: 5.786 ms

-- С одним обычным долго выполняющимся SELECT, открытым на таблице:
ALTER TABLE orders ADD COLUMN note text;
Time: 18065.050 ms (00:18.065)


Второй запуск медленный не потому, что работа тяжелее. Работа идентична и занимает около шести миллисекунд в обоих случаях — добавление столбца без значения по умолчанию не касается ни одной строки, оно лишь редактирует каталог. Восемнадцать секунд тратятся на ожидание блокировки, и пока этот оператор ждёт, он делает кое-что похуже, чем просто медленно работает: он останавливает несвязанных читателей, которые иначе выполнились бы мгновенно.



Именно это стоит усвоить, и это верно независимо от того, какой инструмент миграции вы используете. Время выполнения без конкуренции говорит вам, сколько стоит оператор, когда ничто не стоит у него на пути; оно не предсказывает, во что он обойдётся вашим пользователям. Режим блокировки, время, проведённое в ожидании, и длина окружающей транзакции дополняют эту картину — и только первое число появляется в таймингах ваших миграций.



Безопасное развёртывание с точки зрения блокировок состоит из двух половин. Одна — это проектирование операторов: выбор форм SQL, которые берут более слабые блокировки или откладывают свою дорогостоящую работу до момента, когда блокировка слаба. Другая — это структура программы: выбор того, где проходят границы ваших транзакций, потому что блокировка живёт до конца своей транзакции, а не до конца своего оператора. Эта статья — о первой половине. Она чисто про PostgreSQL и применима независимо от того, с помощью чего вы развёртываете.

Продолжить чтение "ALTER TABLE выполняется быстро. Очередь за ним — нет"

Всё о GUC по порядку: hot_standby

Автор Christophe Pettus: All Your GUCs in a Row: hot_standby


hot_standby — это переключатель, который решает, является ли резервный сервер запасным, на который можно только переключиться, или репликой, с которой можно ещё и читать. По умолчанию он установлен во второе положение начиная с PostgreSQL 10, поэтому для большинства людей, использующих репликацию сегодня, это переключатель, уже находящийся в нужном положении, которое никогда не приходится трогать.



Это логический параметр, по умолчанию включён, его контекст — postmaster, поэтому он фиксируется при запуске сервера. Он включает возможность подключаться к серверу, находящемуся в режиме восстановления, воспроизводящему WAL из архива или от потокового первичного сервера, и выполнять против него запросы только для чтения, пока это воспроизведение продолжается. Часть «только для чтения» обеспечивается принудительно, а не на доверии: любая сессия, подключённая во время восстановления, принудительно переводит свои транзакции в режим только для чтения, что бы клиент ни запрашивал. Функция, которую он включает, — Hot Standby — появилась в PostgreSQL 9.0 и отличает современную читающую реплику от более старого «тёплого резерва» (warm standby), который мог только сидеть и воспроизводить WAL до момента повышения.

Продолжить чтение "Всё о GUC по порядку: hot_standby"

Всё о GUC по порядку: hba_file

Автор Christophe Pettus: All Your GUCs in a Row: hba_file


hba_file — это указатель, а не политика. Он сообщает серверу, где найти pg_hba.conf — файл, который фактически решает, кто может подключиться, откуда, под каким именем и каким методом аутентификации. Обо всех этих решениях hba_file ничего не говорит. Его единственная задача — адрес.



Это строка, её контекст — postmaster, поэтому она фиксируется при запуске сервера, и её можно установить в postgresql.conf. Значение по умолчанию — pg_hba.conf в каталоге данных, куда initdb записывает его при создании кластера. У вас очень редко будет причина его менять, и все возможные причины сводятся к желанию, чтобы файл аутентификации находился где-то вне каталога данных.

Продолжить чтение "Всё о GUC по порядку: hba_file"

Как работают пользовательские типы в PostgreSQL: полное руководство

Пересказ статьи Grant Fritchey. How User-Defined Types work in PostgreSQL: a complete guide


Узнайте, как работать с определяемыми пользователем типами в PostgreSQL, в том числе как эффективно их определять, использовать и управлять ими. В этом руководстве объясняется, как пользовательские типы могут улучшить проектирование схемы, усилить целостность данных и поддерживать более ясные и более удобные в обслуживании структуры баз данных в реальных приложениях.

Я уверен, что не одинок, когда говорю: иногда я отвлекаюсь. В данном конкретном случае я не собирался изучать пользовательские типы (UDT) в PostgreSQL — я просто хотел протестировать поведение, связанное с созданием UDT. Но как только я начал читать, меня зацепило. Я имею в виду четыре разных UDT с разным поведением. Это очень круто. Давайте займемся этим.
Продолжить чтение "Как работают пользовательские типы в PostgreSQL: полное руководство"

Новости за 2026-09-05 - 2026-09-11

§ Новая задача от Pegoopik (1 балл) выставлена для обсуждения под номером 303.

§ Популярные темы недели на форуме

Топик		Сообщений	Просмотров
58 (Learn) 6 6
207 (SELECT) 2 4
53 (Learn) 2 6

§ Авторы недели на форуме

Автор		Сообщений
Steamboat 3
Murderface_ 3
Demon_gr 2
pegoopik 2
selber 2
Продолжить чтение "Новости за 2026-09-05 - 2026-09-11"

Почему SUM после JOIN завышает итог — и почему DISTINCT не всегда помогает

Автор Глеб Зайцев


В отчёте два оплаченных заказа на 1 600 рублей, а запрос возвращает 2 600. Синтаксис правильный, ошибок выполнения нет. Причина может быть в том, что после соединения таблиц одна и та же сумма заказа встречается несколько раз.

Разберём этот случай на маленькой базе SQLite и проверим исправление не только на удачном примере, но и на пограничных данных. Для запуска полного скрипта в конце статьи нужны Python 3 и встроенный модуль `sqlite3`. Внешняя база, аккаунт и дополнительные пакеты не требуются.
Продолжить чтение "Почему SUM после JOIN завышает итог — и почему DISTINCT не всегда помогает"

Всё о GUC по порядку: hash_mem_multiplier

Автор Christophe Pettus: All Your GUCs in a Row: hash_mem_multiplier


Сортировки и хэш-операции имеют разное отношение к памяти, и этот параметр существует потому, что PostgreSQL большую часть своей истории делал вид, что это не так.


hash_mem_multiplier — это значение с плавающей точкой, по умолчанию 2.0, контекст — пользовательский, диапазон от 1.0 до 1000. Что он делает, легко сформулировать: операциям на основе хэширования разрешено использовать work_mem, умноженный на это значение, в то время как операции на основе сортировки получают обычный work_mem. При значениях по умолчанию сортировка может использовать 4 МБ, прежде чем сбросить данные на диск, а хэш-таблица может использовать 8 МБ. Под хэш-таблицами здесь понимаются те, что стоят за хэш-соединениями, хэш-агрегацией, узлами memoize и хэш-обработкой подзапросов IN.

Продолжить чтение "Всё о GUC по порядку: hash_mem_multiplier"

Всё о GUC по порядку: gss_accept_delegation

Автор Christophe Pettus: All Your GUCs in a Row: gss_accept_delegation


gss_accept_delegation — это логический параметр, по умолчанию выключен, его контекст — sighup. Он управляет тем, будет ли ваш сервер PostgreSQL принимать учётные данные Kerberos, которые передаёт ему клиент, и причина, по которой он по умолчанию выключен, заключается в том, что принятие этих данных означает, что сервер сможет затем действовать от имени этого пользователя по отношению к другим системам. Это один из тех параметров, где значение по умолчанию является безопасным выбором, а его включение — это сознательное решение принять на себя риск в обмен на определённую возможность. Поэтому полезное, что может сделать эта статья, — это объяснить саму возможность, риск и то, как определить, действительно ли вы хотите этот обмен.

Продолжить чтение "Всё о GUC по порядку: gss_accept_delegation"

Всё о GUC по порядку: gin_fuzzy_search_limit

Автор Christophe Pettus: All Your GUCs in a Row: gin_fuzzy_search_limit


Это название вводит в заблуждение сразу дважды. Параметр никак не связан с нечётким сопоставлением, то есть с поиском по триграммному сходству или близости написания, ради которого обычно обращаются к pg_trgm. И это на самом деле не совсем ограничение поиска. Неопределённость заключается в размере набора результатов: этот параметр фактически велит PostgreSQL вернуть меньше строк, чем соответствует вашему запросу, причём выбранных случайным образом, и ничего вам об этом не сообщить.



Из-за этого параметр почти уникален среди GUC. Многие параметры позволяют обменивать один ресурс на другой, а некоторые жертвуют надёжностью ради скорости. Этот же жертвует корректностью ради скорости.



Целочисленный параметр, по умолчанию 0, что означает отсутствие ограничения; контекст user, допустимое значение — до 2147483647.

Продолжить чтение "Всё о GUC по порядку: gin_fuzzy_search_limit"

Всё о GUC по порядку: семейство geqo

Christophe Pettus: All Your GUCs in a Row: The geqo Family


Семь параметров, одна функция и разумная цель — никогда не использовать ни один из них.



geqo, geqo_threshold, geqo_effort, geqo_pool_size, geqo_generations, geqo_selection_bias и geqo_seed — все они настраивают Генетический оптимизатор запросов (Genetic Query Optimizer), альтернативный поиск порядка соединений, к которому PostgreSQL прибегает, когда в запросе слишком много отношений для полного перебора обычным планировщиком. Все семь параметров имеют контекст user, поэтому любой из них можно установить для сессии, роли или базы данных.



Причина рассматривать их как группу в том, что шесть из семи имеют значение только в том случае, если вы уже «проиграли». Тот, который имеет значение, — это geqo_threshold, и он определяет, вступают ли в игру остальные шесть вообще.

Продолжить чтение "Всё о GUC по порядку: семейство geqo"