Skip to content

Столбцы JSONB и TOAST в Postgres: пособие по производительности

Пересказ статьи Paul Ramsey. Postgres JSONB Columns and TOAST: A Performance Guide


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

Работа с API и массивами с типом данных jsonb становится все более популярной в настоящее время, и хранение фрагментов данных приложения с использованием jsonb становится общим шаблоном проектирования.

Но зачем разбивать объект JSON на строки и столбцы, а затем восстанавливать его позже, чтобы отправить обратно клиенту?

Ответом является эффективность. PostgreSQL наиболее эффективен при работе со строками и столбцами, и сокрытие структуры данных внутри JSON не позволяет движку работать так быстро, как он мог бы.
Continue reading "Столбцы JSONB и TOAST в Postgres: пособие по производительности"

Всё о GUC по порядку: default_transaction_isolation and default_transaction_read_only

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


Оставшиеся два из трёх параметров default_transaction_*, завершающие набор, начатый параметром default_transaction_deferrable. Каждый из них устанавливает значение по умолчанию для сеанса для одного из трёх свойств транзакции — уровня изоляции, режима доступа и отложенности, — и для всех трёх правило одинаково: область действия GUC редко является той, которая вам нужна. Интересное содержание заключается в том, что означают значения, и для уровня изоляции это больше, чем думает большинство людей.

Continue reading "Всё о GUC по порядку: default_transaction_isolation and default_transaction_read_only"

Аварийное восстановление — это процесс, а не инструмент (Часть 1)

Автор: Richard Yen, Disaster Recovery is a Process, Not a Tool (Part 1)


Когда я работал в Turnitin, мы всё ещё находились на спаде бума доткомов. Все спешили выпускать продукты, и кратковременные сбои, конечно, были нежелательны, но считались нормальной частью работы программного обеспечения в интернете. Если сайт был недоступен несколько минут, вы пожимали плечами, разбирались и исправляли.


Ландшафт изменился


Это уже не тот мир, в котором мы живём сейчас. Время безотказной работы стало гораздо более критичным, чем раньше. Пять девяток когда-то были амбициозной целью — теперь четыре девятки для многих команд являются просто ожидаемым стандартом, и даже несколько минут простоя в месяц кажутся большой проблемой. Мы больше не отслеживаем средние значения в наших метриках; мы отслеживаем p99-задержки, потому что нам действительно важно, чтобы последний 1% пользователей получал хороший опыт работы.


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



Postgres, конечно, не исключение. Именно в таком мире и должен действовать план аварийного восстановления Postgres.

Continue reading "Аварийное восстановление — это процесс, а не инструмент (Часть 1)"

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

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


default_transaction_deferrable устанавливает значение по умолчанию для атрибута транзакции DEFERRABLE для новых транзакций. Значение по умолчанию — off, контекст — user, и атрибут, который он задаёт по умолчанию, не делает ничего, если только не выполнены два других условия, — именно поэтому этот параметр заслуживает нескольких сотен слов, а не одного предложения.

Continue reading "Всё о GUC по порядку: default_transaction_deferrable"

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

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


default_toast_compression определяет, какой алгоритм PostgreSQL использует для сжатия значений, направляемых в TOAST — внестрочное хранилище для значений полей, слишком больших, чтобы помещаться непосредственно на странице кучи размером 8 КБ. Доступны варианты pglz и lz4; по умолчанию во всех выпущенных на данный момент версиях используется pglz; контекст — user, и его можно переопределить для каждого столбца с помощью опции COMPRESSION в CREATE TABLE или ALTER TABLE. Параметр существует начиная с PostgreSQL 14, и более интересный факт заключается в том, что его значение по умолчанию, наконец, скоро изменится.

Continue reading "Всё о GUC по порядку: default_toast_compression"

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

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


default_text_search_config определяет конфигурацию полнотекстового поиска, которую используют функции PostgreSQL для полнотекстового поиска, если вы явно не передаёте им конфигурацию. Значение по умолчанию устанавливается командой initdb на основе локали кластера; контекст — user. Конфигурация полнотекстового поиска связывает парсер (который разбивает текст на токены) с цепочкой словарей (которые преобразуют токены в лексемы — например, приводят «бегущий» к «бежать», отбрасывают стоп-слова вроде «и»), и каждый вызов to_tsvector и to_tsquery нуждается в конфигурации для своей работы. Этот параметр используется теми вызовами, которые опускают явное указание конфигурации.



Это звучит как удобство, и в основном так оно и есть, но этот параметр основан на одном из самых элегантных ограничений PostgreSQL, и именно это ограничение и есть суть данной статьи.

Continue reading "Всё о GUC по порядку: default_text_search_config"

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

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


Сначала о механике, поскольку она кратка: когда default_tablespace содержит что-либо, кроме пустой строки, он неявно добавляет предложение TABLESPACE к каждой команде CREATE TABLE и CREATE INDEX, в которой это предложение явно не указано, включая индекс, создаваемый для ограничений UNIQUE или PRIMARY KEY. Значение по умолчанию — пустая строка, что означает «использовать табличное пространство самой базы данных», а контекст — user. Чтобы иметь мнение об этом параметре, нужно иметь мнение о табличных пространствах, и моё, в 2026 году, таково: в основном не используйте. Мы ещё дойдём до этого. Сначала — особенности.

Continue reading "Всё о GUC по порядку: default_tablespace"

Новости за 2026-07-04 - 2026-07-10

§ Лидеры недели

	Участник		w_sel	all_sel	select	dml	Всего	Рейтинг
Багманов Д.Д. (Bagmanov_Dinar 20 20 28 11 39 2643
Шибаев (saah) 7 57 18 0 18 1234
Сафронов П.А. (Paulus73) 5 155 14 0 14 134
Odnokurtsev (AlFochino) 3 127 8 59 67 175
Fom (Kamchatka) 3 9 5 0 5 5634
Smirnov S. (hr) 3 28 4 0 4 1388

§ Претенденты на попадание в TOP 100

Рейтинг	 Участник (решенные задачи, время в днях)
134 Paulus73 (155, 15.028)
140 Rujan (143, 451.925)
169 Tigra1 (138, 24.441)
175 AlFochino (127, 121.400)

Continue reading "Новости за 2026-07-04 - 2026-07-10"