Skip to content

pretty_explain_*: как сделать планы запросов PostgreSQL читаемыми и стабильными для тестов

Автор: Andrei Lepikhov, EXPLAIN Prettier, or Post-Processing Query Plans in Postgres


Эта история началась с книги, подаренной коллегой. Читая книгу Джимми Ангелакоса «PostgreSQL Mistakes and How to Avoid Them», я осознал одну вещь, которая давно меня беспокоила: в Postgres команда EXPLAIN выдаёт слишком много информации. Примеры, которые авторы обычно приводят при обсуждении различных аспектов систем баз данных, усложняют анализ рассматриваемой проблемы и отвлекают читателя. Так родилась идея пост-обработки вывода EXPLAIN — чтобы сделать планы запросов более читаемыми и сфокусированными на проблеме.

Продолжить чтение "pretty_explain_*: как сделать планы запросов PostgreSQL читаемыми и стабильными для тестов"

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

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


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


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

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

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


client_encoding объявляет, в какой кодировке символов говорит клиент. Сервер использует этот параметр для преобразования между своей внутренней кодировкой (устанавливается во время initdb, для каждой базы данных, часто UTF-8) и тем, что клиент отправляет и ожидает получить. Значение по умолчанию — «the server’s encoding», то есть без преобразования. Контекст параметра — user, с переменной окружения PGCLIENTENCODING, которую libpq учитывает автоматически, по аналогии с application_name.


В мире UTF-8 этот параметр редко проявляется. Сервер — UTF-8, клиент — UTF-8, преобразования не происходит, жизнь хороша. Но «редко проявляется» — это не то же самое, что «не существует», и случаи, когда он проявляется, стоят понимания.


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

Новости за 2026-06-13 - 2026-06-19

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

	Участник		w_sel	all_sel	select	dml	Всего	Рейтинг
Шибаев (saah) 13 37 18 0 18 1789
Сафронов П.А. (Paulus73) 5 139 17 0 17 139
Быков (EvgenyAstro) 10 10 15 11 26 4131
Виноградова С.М. (Tigra1) 3 135 8 0 8 182
Макаров И.А. (_Bkmz_) 1 180 5 0 5 49
P I.*. (IrinaPetr) 3 81 5 0 5 608
Gitinomagomedov (gmansur88) 4 52 5 0 5 1052
Odnokurtsev (AlFochino) 1 122 4 0 4 256

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

Рейтинг	 Участник (решенные задачи, время в днях)
139 Paulus73 (139, 11.160)
141 Rujan (143, 451.925)
182 Tigra1 (135, 22.569)
Продолжить чтение "Новости за 2026-06-13 - 2026-06-19"

Всё о GUC по порядку: checkpoint_flush_after и checkpoint_warning

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


Два параметра, смежных с контрольными точками, объединённые алфавитной близостью, а не тематическим родством. checkpoint_flush_after — третий из четырёх параметров *_flush_after для выталкивания (writeback); checkpoint_warning — это журнальный параметр, который выводит предупреждение, когда контрольные точки срабатывают слишком часто. Разные задачи, разная аудитория, но ни один из них не требует 400 слов отдельно.

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

Всё о GUC по порядку: checkpoint_timeout и checkpoint_completion_target

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


Кластер параметров на букву C открывается первыми двумя параметрами контрольных точек. Мы выводим их из алфавитного порядка, потому что checkpoint_completion_target определён как доля от checkpoint_timeout и не имеет смысла без него. Алфавит может подождать одну статью.

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

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

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


Параметр, о котором большинство операторов никогда не знали, хотя каждый дамп-файл PostgreSQL, который они когда-либо просматривали, устанавливает его. check_function_bodies управляет тем, проверяет ли PostgreSQL тело функции при создании CREATE FUNCTION или CREATE PROCEDURE. Значение по умолчанию — on. Контекст параметра — user.

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

Иерархические типы данных

Пересказ статьи Florent Jardin. Hierarchical data types


Стандарт SQL определяет ряд правил, которые позволяют системам баз данных быть взаимозаменяемыми, но в реальности есть небольшие особенности. В этой связи тип данных hierarchyid в SQL Server является показательным примером. Если вы перейдете на PostgreSQL, вам будут доступны два решения.

Первое и более простое решение - это связать каждый узел со своим родителем, используя новый столбец parentid и применяя ограничение внешнего ключа. Другой более сложный подход заключается в использовании расширения ltree. В данной статье рассматривается последний вариант.
Продолжить чтение "Иерархические типы данных"

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

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


bytea_output управляет тем, как PostgreSQL форматирует двоичные данные при отправке клиенту. Два значения: hex (значение по умолчанию, начиная с PostgreSQL 9.0, вышедшего в 2010 году) и escape (традиционный формат, уходящий корнями в начало 2000-х). Контекст параметра — user. Параметр влияет только на вывод — ввод bytea принимал оба формата всегда, и установка SET bytea_output ничего не меняет в том, как вы записываете литеральные значения.

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

Всё о GUC по порядку: bonjour и bonjour_name

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


Короткая статья о двух параметрах, которые были очаровательной идеей в 2002 году и с возрастом превратились в курьёз.

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

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

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


Параметр, который вы не можете изменить. block_size находится в разделе «Предустановленные параметры» (Preset Options) документации, вместе со своими «кузенами» только для чтения, такими как data_checksums, wal_block_size и server_version. Он сообщает размер страницы PostgreSQL — фундаментальной единицы хранения на диске и учёта в буферном пуле. Значение по умолчанию — 8192 байта. Он доступен только для чтения во время выполнения, может быть установлен только во время компиляции PostgreSQL, а его изменение после создания кластера означает, что нужно начать всё заново с новым кластером.


Так зачем же он вообще в pg_settings? Потому что всё в базе данных измеряется в единицах этого размера.

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

Методы разбиения на страницы в SQL: повышение производительности запросов и эффективное управление памятью

Пересказ статьи Pradip Bhusnar. SQL Pagination Techniques: Enhancing Query Performance and Managing Memory Efficiently


Эффективная обработка разбивки на страницы (пагинация) в SQL, особенно в высоконагруженных системах, требует тщательного учета как использования памяти, так и производительности. Здесь представлен детальный обзор проектирования и эффективного применения запросов постраничной разбивки.

Основные методы эффективной разбивки на страницы в SQL


1. Limit и Offset:

  • Традиционная разбивка на страницы с использованием LIMIT и OFFSET проста, но может оказаться неэффективной при больших смещениях.

  • Например:

    SELECT * FROM data_table
    ORDER BY timestamp DESC
    LIMIT 10 OFFSET 1000;

  • Проблемы производительности: по мере увеличения смещения базе данных приходится сканировать больше строк, что может привести к значительному падению производительности.

Продолжить чтение "Методы разбиения на страницы в SQL: повышение производительности запросов и эффективное управление памятью"

Всё о GUC по порядку: debug_* family

Автор: Christophe Pettus, All Your GUCs in a Row: the debug_* family


Двенадцать параметров имеют префикс debug_, и этот префикс является значимым: это собственные средства разработки и контроля качества PostgreSQL, предоставленные в виде настроек времени выполнения, чтобы сборочная ферма (buildfarm) и разработчики ядра могли тестировать пути кода без перекомпиляции. Pavlo Golub, пишущий об одном из них, подвёл итог правильному подходу: «Я никогда-никогда не буду трогать параметр времени выполнения с префиксом “debug” в своих производственных кластерах». В основном это правильно. Давайте разберём дюжину параметров и то, что они на самом деле дают, потому что один или два тихо полезны, а остальными стоит восхищаться с безопасного расстояния.

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

Зло (и польза) DISTINCT

Пересказ статьи Louis Davidson. The evil (and value) of DISTINCT


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

Я наблюдал такие DISTINCT, которые скрывали плохие соединения, отсутствующую группировку и даже пропущенные предложения WHERE. Я видел разработчиков, которые использовали его как "универсальное решение" проблем с данными.

В этой статье я рассмотрю правильное и явно опасное использование DISTINCT, а также покажу, как вы можете протестировать ваш запрос, который использует DISTINCT, чтобы увидеть, что он на самом деле скрывает.
Продолжить чтение "Зло (и польза) DISTINCT"
Категории: T-SQL