Skip to content

Контрольные точки, лавинная запись и вы

Автор: Shaun Thomas,Checkpoints, Write Storms, and You


Каждая база данных должна примириться с двумя неприятными истинами: память быстра, но энергозависима, а диск медленен, но долговечен. Postgres справляется с этим противоречием с помощью журнала предзаписи (Write-Ahead Log, WAL), который регистрирует каждое изменение до того, как оно произойдёт. Но WAL не может расти бесконечно. В какой-то момент Postgres должен сбросить все накопившиеся грязные страницы на диск и объявить чистую начальную точку. Этот процесс называется контрольной точкой (checkpoint), и когда он идёт не по плану, пропускная способность может упасть до нуля.

Продолжить чтение "Контрольные точки, лавинная запись и вы"

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

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

Автор		Сообщений
selber 6
qwrqwr 5
gennadi_s 2
_Bkmz_ 2

§ Изменения среди лидеров рейтинга

Рейтинг	Участник (решенные задачи)
15 gennadi_s (196, 197)
38 Шведа Сауля (158)
116 rock_4 (254)

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

pg_column_size(): То, что вы видите, не всегда то, что получаете

Автор: Lætitia AVROT, pg_column_size(): What you see is not what you get


Благодаря моему коллеге Озаиру (Ozair), который прислал мне запрос в JIRA: «Мне нужно удалить этот огромный столбец, каковы будут последствия?» Мой первый вопрос был: насколько он огромен? И тут кроличья нора открылась.


Это выглядит просто. Это просто. Просто используйте административную функцию pg_column_size(). Пока у вас нет атрибутов, обработанных TOAST. Тогда становится интересно.

Продолжить чтение "pg_column_size(): То, что вы видите, не всегда то, что получаете"

Что такое collation (правило сортировки) и почему мои данные повреждены?

Автор: Shaun Thomas, What is a Collation, and Why is My Data Corrupt?



Библиотека GNU C (glibc) версии 2.28 появилась на свет 1 августа 2018 года, и с тех пор Postgres уже не был прежним. Среди множества её изменений было масштабное обновление данных локалей для сопоставления (collation), приведшее их в соответствие с изданием 4 стандарта ISO 14651 (выпуск 2016 года) и Unicode 9.0.0. Это была не мелкая правка. Это была кульминация примерно 18 лет накопленных изменений в локалях, объединённых в одном выпуске.


Никто не устраивал вечеринку.


За этим последовал один из самых значительных и коварных инцидентов с целостностью данных в истории Postgres. Индексы молча становились повреждёнными, результаты запросов менялись без предупреждения, уникальным ограничениям больше нельзя было доверять. Самая страшная часть? Нужно было знать, что искать. Postgres не жаловался. Операционная система не жаловалась. Всё выглядело нормально, ровно до тех пор, пока это не переставало быть так.


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

Продолжить чтение "Что такое collation (правило сортировки) и почему мои данные повреждены?"

Секционирование или шардинг в базах данных: в чем разница?

Пересказ статьи Sandeeppant. Partitioning vs. Sharding in Databases: What’s the Difference?


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

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

В этой статье мы узнаем:

  • Что такое секционирование и как это работает.

  • Что такое шардинг и чем оно отличается.

  • Практические примеры в MySQL и PostgreSQL.

  • Реальные случаи использования, которые освещают каждую технологию.

Продолжить чтение "Секционирование или шардинг в базах данных: в чем разница?"

Внутреннее устройство WAL в PostgreSQL для инженеров данных

Пересказ статьи Jonathan Duran. PostgreSQL WAL Internals for Data Engineers


Понимание PostgreSQL WAL


Недавно, работая над проектом CDC, я осознал, что никогда в действительности не находил времени, чтобы вникнуть во внутреннее устройство PostgreSQL, которое делает возможным потоковую обработку транзакций. Все мы знаем CDC (захват измененных данных) как магию, которая позволяет нам помещать изменения данных почти в реальном времени в системы типа Kafka, Snowflake или data lake - но на самом деле основную работу выполняет специальный компонент инженерных решений PostgreSQL: журнал предупреждающей записи (WAL).

Эта статья посвящена данному компоненту - что такое WAL, как он обеспечивает надежность PostgreSQL, и какую роль он играет в возможности CDC. Мы обсудим то, как PostgreSQL обрабатывает транзакции из памяти на диск, как он избегает дорогих операций ввода-вывода, и как он элегантно восстанавливает данные после сбоя. Продолжить чтение "Внутреннее устройство WAL в PostgreSQL для инженеров данных"

Нужно ли настраивать Vacuum в Postgres?

Авторы: Elizabeth Garrett Christensen и Erik Jones, Do You Need to Tune Postgres Vacuum?

Если вы работаете с Postgres какое-то время, вы, вероятно, слышали, как кто-то упоминал «очистку» (vacuuming) базы данных или использовал термин «раздувание» (bloat). Оба эти понятия звучат как рутинная и надоедливая работа, но они — просто часть жизни здоровой базы данных. В современных версиях Postgres autovacuum обычно обрабатывает эти проблемы за кулисами. Но по мере роста вашей базы данных вы можете начать задаваться вопросом: достаточно ли настроек по умолчанию? Нужно ли мне запускать очистку Postgres вручную? Или почему моя база данных внезапно занимает гораздо больше места на диске, чем должна?


Давайте углубимся в то, зачем нужна очистка, как работает autovacuum и когда вам действительно нужно вмешаться и настроить его.



Продолжить чтение "Нужно ли настраивать Vacuum в Postgres?"

Новости за 2026-03-28 - 2026-04-03

§ Новая задача от Baser и pegoopik опубликована на рейтинговом этапе под номером 24 (оценка сложности 2 балла).
Выполнены следующие переносы:
Новая задача -> 24 -> 4 -> 166 (обуч.этап).
Второй этап теперь начинается с задачи 4.


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

Топик		Сообщений	Просмотров
193 (Learn) 7 9
140 (SELECT) 5 6
Guest's book 3 16

Продолжить чтение "Новости за 2026-03-28 - 2026-04-03"

Как быстро освоить CI/CD

Автор: Itzik Gan Baruch, How to learn CI/CD fast


Непрерывная интеграция и непрерывная доставка (CI/CD) критически важны для ускорения выпуска программного обеспечения, и начать работать с ними не так сложно, как кажется. CI/CD стали краеугольной технической архитектурой успешных внедрений DevSecOps. CI/CD имеет репутацию сложной и труднодостижимой, но это не обязательно так. Современные инструменты позволяют командам начать работу с минимальной настройкой и управлением инфраструктурой. Вот как вы можете «быстро стартовать» с CI/CD и получить быстрые, наглядные победы в производительности для вашей команды DevSecOps.

Продолжить чтение "Как быстро освоить CI/CD"

Обеспечение высокой доступности PostgreSQL с помощью Patroni и Ansible

Автор: ByteGoblin/, Setting Up PostgreSQL High Availability with Patroni and Ansible


В современном мире, управляемом данными, обеспечение высокой доступности вашей базы данных имеет решающее значение для непрерывности бизнеса. PostgreSQL — мощная открытая реляционная база данных, которую можно настроить для обеспечения высокой доступности (High Availability, HA), чтобы минимизировать простои и сохранить доступ к данным. Одно из популярных решений для достижения высокой доступности PostgreSQL — использование Patroni (шаблона для управления кластерами PostgreSQL) в сочетании с Ansible (инструментом автоматизации, который упрощает развёртывание приложений, управление конфигурацией и оркестрацию).


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

Продолжить чтение "Обеспечение высокой доступности PostgreSQL с помощью Patroni и Ansible"

Сочетания, перестановки и беспорядочность

Автор: Joe Celko, Combinations, permutations, and derangements


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


Факториалы


Функция факториала обычно записывается как (n)!, и она определяется как произведение первых (n) натуральных чисел. Таким образом, 5! равно (5 · 4 · 3 · 2 · 1) = 120. Как обычно, ноль — это особый случай: 0! = 1, что можно доказать с помощью несколько иного определения факториала. Вместо определения через произведение определим его рекурсивно следующим образом: n! = CASE WHEN n = 0 THEN 1 ELSE n · (n-1)! END.


Показывая процесс шаг за шагом, рекурсия разворачивается так:


5! = 5 · 4!
4! = 4 · 3!
3! = 3 · 2!
2! = 2 · 1!
1! = 1 · 0!

Посмотрите на последний шаг рекурсии. Теперь разделите обе части на единицу, чтобы получить (1! / 1) = 0! или 1 = 0! Обратите внимание, что всё, что было сделано до сих пор, является процедурным, а не ориентированным на множества. Специалисты по реляционным СУБД предпочитают уходить от процедурного кода. Для остальной части этой статьи вы можете думать о n! как о количестве способов упорядочить (n) элементов множества в последовательность. Очевидно, если у вас есть один элемент, то у вас есть только один способ упорядочивания. Но точно так же, если у вас ноль элементов, вы также на этом закончили. Как существует только одно пустое множество, так существует и только одна пустая последовательность.


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


0! = 1
1! = 1
2! = 2
3! = 6
4! = 24
5! = 120
6! = 720
7! = 5 040
8! = 40 320
9! = 362 880
10! = 3 628 800
11! = 39 916 800
12! = 479 001 600
Продолжить чтение "Сочетания, перестановки и беспорядочность"

CTE - Хороший, плохой, злой

Автор: Radim Marek, Good CTE, bad CTE


Обобщённое табличное выражение (Common Table Expression, CTE) — это первая возможность, к которой часто обращаются разработчики, выходя за рамки базового SQL, а зачастую и единственная. Вы пишете подзапрос после WITH, даёте ему имя и используете в остальной части запроса. Он существует только на время выполнения этого запроса.


Но популярность CTE обычно связана не столько с модернизацией кода, сколько с обещанием императивной логики. Для многих CTE выступает в роли простого для понимания средства от «страшных запросов» и способа навязать базе данных порядок выполнения. Многие пишут запросы так, как будто они говорят оптимизатору: «сначала сделай это, затем сделай то».


Это создаёт проблему. CTE обеспечивают декомпозицию запросов, рекурсию и многосоставные DDL. Планировщик обрабатывает их по-разному в зависимости от того, как вы их пишете и используете. Долгое время (до PostgreSQL 12) CTE служили барьером для оптимизации. Планировщик не мог проталкивать условия предикатов внутрь них, не мог использовать индексы на нижележащих таблицах. Он не мог сделать ничего, кроме как материализовать их и просканировать полученный результат.


PostgreSQL 12 изменил это. Теперь CTE могут быть встроены, материализованы или находиться в промежуточном состоянии, в зависимости от того, как вы их пишете.

Продолжить чтение "CTE - Хороший, плохой, злой"

Настройка производительности в PostgreSQL 17: Понимание параметров стоимости оптимизатора

Пересказ статьи Jeyaram Ayyalusamy. 32 - PostgreSQL 17 Performance Tuning: Understanding Optimizer Cost Parameters


PostgreSQL известна как одна из наиболее продвинутых реляционных баз данных с открытыми кодами, и одна из основных причин ее силы - оптимизатор запросов на основе стоимости.

Когда вы запускаете запрос, оптимизатор не выполняет его непосредственно. Он генерирует множество возможных планов выполнения и оценивает их стоимость. Выбирается план с самой низкой оценкой стоимости. Стоимость не измеряется в миллисекундах или циклах ЦП - она представляет собой абстрактные единицы, которые PostgreSQL использует для сравнения.

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

В этой статье мы:

  1. Создадим таблицу с 10 миллионами строк для имитации реальной рабочей нагрузки.

  2. Создадим индексы, чтобы дать возможность PostgreSQL построить несколько планов выполнения.

  3. Подробно разберем модель стоимости в PostgreSQL.

  4. Покажем, как настройка параметров стоимости может изменить решение при выборе плана.

Продолжить чтение "Настройка производительности в PostgreSQL 17: Понимание параметров стоимости оптимизатора"

Новости за 2026-03-21 - 2026-03-27

§ Новая задача от pegoopik опубликована на обучающем этапе под номером 193 (оценка сложности 2 балла).


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

Топик		Сообщений	Просмотров
27 (DML) 7 4
89 (SELECT) 3 6
24 (DML) 2 6
138 (SELECT) 2 5
Продолжить чтение "Новости за 2026-03-21 - 2026-03-27"

Cуперспособности EXPLAIN в PostgreSQL

Автор: Richard Yen, EXPLAIN's Other Superpowers


Большинство людей, работающих с PostgreSQL, в конечном итоге узнают две команды для настройки запросов: EXPLAIN и EXPLAIN ANALYZE.


EXPLAIN показывает выбранный планировщиком план выполнения, а EXPLAIN ANALYZE выполняет запрос и добавляет статистику времени выполнения. Для большинства задач настройки этого уже достаточно для получения большого объёма информации.


Но многие не осознают, что у EXPLAIN есть ещё несколько опций, которые могут значительно упростить устранение неполадок. В некоторых случаях они отвечают на вопросы, на которые EXPLAIN ANALYZE сам по себе ответить не может.


В этой статье мы рассмотрим некоторые из этих менее популярных опций.

Продолжить чтение "Cуперспособности EXPLAIN в PostgreSQL"