Skip to content

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

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


Параметр для разработчиков (developer option) и действительно полезный. backtrace_functions принимает разделённый запятыми список имён внутренних C-функций; если ошибка возникает внутри любой функции из списка, PostgreSQL записывает трассировку стека на уровне C (C-level stack trace) в журнал сервера вместе с ошибкой. Добавлен в PostgreSQL 13. Значение по умолчанию — пустая строка. Контекст — superuser (или любой пользователь с соответствующим привилегией SET). Доступен не на всех платформах, и качество вывода зависит от того, как был скомпилирован PostgreSQL.


Это необычная область для оператора — это параметр для исследования исходного кода самого сервера, когда что-то идёт не так, а не для настройки поведения. Но если вы когда-либо смотрели на ошибку ERROR: tuple concurrently updated или cache lookup failed for relation NNNNN и задавались вопросом «откуда это в исходном коде», это инструмент для вас.

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

Новости за 2026-05-30 - 2026-06-05

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

Топик		Сообщений	Просмотров
231 (SELECT) 6 3
147 (SELECT) 5 6
41 (Learn) 3 9
234 (SELECT) 3 5
40 (Learn) 2 10

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

Автор		Сообщений
pegoopik 10
alex_v 6
selber 4
SqlExOYMaxim 3

Продолжить чтение "Новости за 2026-05-30 - 2026-06-05"

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

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


Первый исторический артефакт в кластере параметров на букву B. backslash_quote управляет тем, принимается ли \' как способ представления одиночной кавычки внутри строкового литерала SQL. Он существует из-за уязвимости SQL-инъекции 2006 года, связанной с многобайтовыми кодировками символов, и почти двадцать лет спустя он всё ещё находится в списке GUC, потому что его удаление нарушило бы работу какого-нибудь приложения где-то. PostgreSQL консервативен в таких вопросах.

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

TOAST — куда PostgreSQL прячет большие значения

Автор: Radim Marek, TOAST: Where PostgreSQL hides big values


Каждый кортеж кучи (heap tuple) живёт внутри страницы размером строго 8 КБ. Всё остальное построено поверх этого жёсткого ограничения: MVCC, HOT update и индексы, указывающие на (страница, указатель_строки). И тем не менее, это всё ещё работает:


CREATE TABLE docs (id int PRIMARY KEY, body jsonb);
INSERT INTO docs VALUES (1, (SELECT jsonb_agg(g) FROM generate_series(1, 100000) g));

Это значение body где-то за полмегабайта. Страница кучи по-прежнему имеет размер 8 КБ. Оба утверждения истинны одновременно, и механизм, который позволяет им сосуществовать, называется TOAST: The Oversized-Attribute Storage Technique (техника хранения чрезмерно больших атрибутов).

Продолжить чтение "TOAST — куда PostgreSQL прячет большие значения"

Прозрачное шифрование данных и высокая доступность

Автор: stormatics.tech, Transparent Data Encryption and High Availability


Прозрачное шифрование данных (Transparent Data Encryption, TDE) стало обязательным требованием для многих предприятий, хранящих конфиденциальные данные, будь то персональные или финансовые. Однако этот эффект обычно означает, что резервные копии бесполезны без отдельного хранимого ключа шифрования, а запуск самого сервера может не выполняться в полностью автоматизированном режиме (в зависимости от того, как настроено управление ключами). Взаимодействие между этими компонентами не всегда интуитивно понятно. Данная статья призвана внести ясность.


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

Продолжить чтение "Прозрачное шифрование данных и высокая доступность"

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

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


Мы открываем кластер параметров на букву B параметром, само существование которого является признанием сложных отношений. У PostgreSQL сложные отношения с кэшем страниц Linux (page cache), и backend_flush_after — один из четырёх GUC, которые существуют для управления этими отношениями. Остальные три — bgwriter_flush_after, checkpoint_flush_after и wal_writer_flush_after — получат свои собственные статьи в своё время. Они используют общий механизм и имеют общую мотивацию, и эту мотивацию стоит понять, прежде чем мы погрузимся в конкретный параметр.

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

SSL в PostgreSQL: введение в шифрование подключений к базе данных

Автор: Shridhar Khanal, SSL in PostgreSQL



«"SSL включён" и "SSL действительно работает" — это две большие разницы».


Продолжить чтение "SSL в PostgreSQL: введение в шифрование подключений к базе данных"

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

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


Последняя запись в кластере параметров автовакуума и самая новая. PostgreSQL 18 представил autovacuum_worker_slots для решения давней операционной проблемы: изменение autovacuum_max_workers ранее требовало перезапуска сервера, что делало невозможным реагирование на меняющуюся рабочую нагрузку вакуума без окна обслуживания. PG 18 исправляет это, разделяя параметр на две части.

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

wal_level, который вы установили, — это не тот wal_level, который вы получите

Автор: Christophe Pettus, The wal_level You Set Is Not the wal_level You Get


С тех пор как в PostgreSQL существует логическая репликация, правило было таковым: если вы когда-нибудь захотите её использовать, установите wal_level = logical при запуске сервера и живите с объёмом WAL вечно. Стоимость не была катастрофической, но она была постоянной. Установите один раз — платите всегда, включая 364 дня в году, когда вы не использовали ни одного логического слота.


PostgreSQL 19 меняет это. Параметр всё ещё существует. Он просто больше не совсем то, что вы установили.

Продолжить чтение "wal_level, который вы установили, — это не тот wal_level, который вы получите"

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

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


autovacuum_work_mem задаёт максимальный объём памяти, который каждый рабочий процесс автовакуума может использовать для отслеживания идентификаторов мёртвых кортежей (TID — tuple identifier) во время вакуума. Значение по умолчанию: -1, что означает «унаследовать от maintenance_work_mem». Контекст параметра — sighup. Этот параметр существует для того, чтобы потребление памяти автовакуумом можно было настраивать независимо от памяти, используемой ручным VACUUM, CREATE INDEX, REINDEX и другими разовыми операциями обслуживания.

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

Делаем JSONB более удобным для запросов с помощью генерируемых столбцов

Автор: Richard Yen, Making JSONB More Queryable with Generated Columns


За последний год я работал в нескольких контекстах, управляя большими объёмами данных, хранящихся в формате JSONB в PostgreSQL. Сценарий обычен: пользователи ценят гибкость документо-ориентированной модели хранения, избегая необходимости предопределять схемы или постоянно мигрировать структуры таблиц по мере изменения их требований к данным. JSONB-документы могут быть глубоко вложенными с многочисленными необязательными полями и масштабироваться до сотен килобайт на запись без проблем. Однако, когда приходит время запрашивать эти документы — фильтровать по идентификатору пользователя, типу события, временным меткам или вложенным свойствам действий — запросы могут стать медленными и/или неудобными для работы.


Проблема, которую я хочу решить: «Как сделать поиск по JSONB-данным более эффективным, не разбивая наши документы и не вставляя их в столбцы реляционной базы данных?» В Postgres доступно несколько подходов, каждый со своими компромиссами. Я надеюсь пролить свет на эти подходы в этой статье.

Продолжить чтение "Делаем JSONB более удобным для запросов с помощью генерируемых столбцов"

Всё о GUC по порядку: autovacuum_vacuum_scale_factor и autovacuum_vacuum_threshold

Автор: Christophe Pettus, All Your GUCs in a Row: autovacuum_vacuum_scale_factor and autovacuum_vacuum_threshold


Классическая пара параметров запуска вакуума, наконец. Последние несколько статей мы потратили на параметры, которые изменяют, ограничивают или дополняют формулу запуска, управляемую этими двумя; теперь мы добрались до оригиналов.



Формула:


порог_вакуума = autovacuum_vacuum_threshold
+ autovacuum_vacuum_scale_factor × reltuples


Когда количество устаревших кортежей (обновлённых или удалённых строк) с момента последнего вакуума превышает это значение, автовакуум планирует выполнение VACUUM для таблицы. В PostgreSQL 18 и новее результат также ограничивается параметром autovacuum_vacuum_max_threshold. Значения по умолчанию: autovacuum_vacuum_threshold = 50, autovacuum_vacuum_scale_factor = 0.2. Оба параметра имеют контекст sighup, и для каждого существуют переопределения на уровне таблицы через параметры хранения.

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

Оптимизация поиска при использовании SQL LIKE с подстановочными знаками

Пересказ статьи Simon Liew. Optimize SQL LIKE Wildcard Searches


Полный поиск по шаблону (например, LIKE '%поисковая_фраза%') в Microsoft SQL Server может быть медленным и неэффективным, поскольку гарантируется сканирование всех строк в таблице. Имеются ли какие-нибудь варианты оптимизации запросов с оператором SQL LIKE?

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

Новости за 2026-05-23 - 2026-05-29

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

Топик		Сообщений	Просмотров
303 (SELECT) 10 3
-9 (DML) 5 7
216 (SELECT) 4 4
155 (SELECT) 2 7
779 (SELECT) 2 7

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

Автор		Сообщений
pegoopik 9
alex_v 5
gennadi_s 3
selber 2

Продолжить чтение "Новости за 2026-05-23 - 2026-05-29"

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

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


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



Исходная формула:


порог_вакуума = autovacuum_vacuum_threshold
+ autovacuum_vacuum_scale_factor × reltuples


При значениях по умолчанию — autovacuum_vacuum_threshold = 50 и autovacuum_vacuum_scale_factor = 0.2 — таблица на 100 миллионов строк ждёт 20 миллионов мёртвых кортежей, прежде чем запустится вакуум. Таблица на миллиард строк ждёт 200 миллионов. К моменту, когда вакуум действительно запускается, у вас уже огромное количество раздувания (bloat), сам вакуум занимает часы, а следующий запускается из такого же плохого состояния.


Классическим обходным решением (workaround) была покадровая настройка autovacuum_vacuum_scale_factor для каждой таблицы до значений вроде 0.02 или 0.005, которую мы обсудим, когда доберёмся до этих параметров в следующей статье. Это работает, но требует предварительного выявления каждой большой таблицы и назначения ей индивидуальных параметров хранения (storage parameters). Легко забыть, легко упустить, когда маленькая таблица вырастает в большую.

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