Skip to content

Выбор метода текстового поиска в PostgreSQL

Автор: Craig Ringer, Choosing a PostgreSQL text search method


(Эта статья написана применительно к PostgreSQL 9.3. Если вы используете более новую версию, пожалуйста, проверьте, остались ли описанные ограничения в силе.)



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

Continue reading "Выбор метода текстового поиска в PostgreSQL"

PostgreSQL MVCC, байт за байтом

Автор: , Radim Marek: PostgreSQL MVCC, Byte by byte


Вы выполняете SELECT * FROM orders в одном сеансе psql и видите 50 миллионов строк. Ваш коллега в другом сеансе выполняет тот же запрос в тот же момент и видит 49 999 999. Никто из вас не ошибается, и никто не видит устаревших данных. Вы оба читаете одни и те же страницы кучи размером 8 КБ, одни и те же байты на диске.



В этом заключается обещание MVCC (многоверсионного контроля конкурентного доступа) PostgreSQL, и именно поэтому читатели никогда не блокируют писателей, а писатели никогда не блокируют читателей. Это также одна из самых неправильно понимаемых частей механизма хранения. Люди знают, что «существует несколько версий строки», и на этом останавливаются.

Continue reading "PostgreSQL MVCC, байт за байтом"

Настройка производительности PostgreSQL 17: индекс BRIN (Block Range INdex)

Пересказ статьи Jeyaram Ayyalusamy. 22 - PostgreSQL 17 Performance Tuning: BRIN (Block Range INdex)




При работе с очень большими таблицами в PostgreSQL традиционные индексы типа B-Tree или GiST могут чрезвычайно вырасти в размерах, что занимает значительное время на их обслуживание. Для временных рядов или последовательно упорядоченных данных PostgreSQL предлагает более разумный и облегченный вариант: BRIN (Block Range Index).

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

Давайте пошагово рассмотрим пример.
Continue reading "Настройка производительности PostgreSQL 17: индекс BRIN (Block Range INdex)"

DROP COLUMN в PostgreSQL: столбец не удаляется сразу

Пересказ статьи Tomasz Gintowt. PostgreSQL DROP COLUMN: It Doesn’t Remove the Column Immediately


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

Начиная с PostgreSQL 11, операция ALTER TABLE ... DROP COLUMN стала выполняться быстрее, поскольку PostgreSQL больше не переписывает всю таблицу сразу. Напротив, он:

  • Помечает столбец как удаленный (невидимый и недоступный).

  • Временно оставляет его данные на диске.

  • Освобождает хранилище, только когда таблица переписывается (VACUUM FULL, CLUSTER или pg_repack).

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


Continue reading "DROP COLUMN в PostgreSQL: столбец не удаляется сразу"

"Простая" функция, которой нет: миграция функции T-SQL STR() в PostgreSQL

Пересказ статьи Assaf Fraenkel. The “Simple” Function That Isn’t: Migrating T-SQL’s STR() to PostgreSQL


Иногда миграция оказывается более сложной, чем ожидалось. На первый взгляд определение функции STR в SQL Server является простым: она возвращает символьное представление числовых данных, выровненные по правому краю с заданной длиной и точностью до десятичных знаков. Однако при попытке конвертации вы обнаруживаете огромное число пограничных случаев, большинство из которых плохо документированы.

Техническая спецификация


Стандартной спецификацией этой функции является:

STR ( float_expression [ , length [ , decimal ] ] )
  • Значение по умолчанию Length (длина): 10
  • Значение по умолчанию Decimal (масштаб): 0
Continue reading ""Простая" функция, которой нет: миграция функции T-SQL STR() в PostgreSQL"

Погружение в события ожиданий PostgreSQL

Автор: Richard Yen, Understanding PostgreSQL Wait Events


Одним из самых полезных инструментов отладки в современном PostgreSQL является система событий ожиданий (wait events). Когда запрос замедляется или база данных становится ограниченной по процессору, естественно возникает вопрос: «Чего на самом деле ожидают сеансы?» Postgres предоставляет эту информацию через представление pg_stat_activity с помощью двух столбцов:



  • wait_event_type — тип события ожидания

  • wait_event — само событие ожидания


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


LWLock


Если вы когда-либо видели панели мониторинга, полные ожиданий LWLock, вы не одиноки в своих сомнениях о том, что они означают и являются ли они проблемой.

Continue reading "Погружение в события ожиданий PostgreSQL"

Нулевая задержка autovacuum_vacuum_cost_delay - вас сметёт лавина записи

Автор: Jeremy Schneider, Zero autovacuum_vacuum_cost_delay, Write Storms, and You


Несколько дней назад Шон Томас (Shaun Thomas) опубликовал статью в блоге pgEdge под названием «Контрольные точки, лавинная запись и вы». К сожалению, на многих корпоративных блогах больше нет возможности комментировать. Я оставил несколько комментариев в LinkedIn, но в целом позвольте мне сказать, что эта статья — отличное чтение, и я всегда рад, когда кто-то погружается в важную и обойдённую вниманием тему, даёт хорошее техническое описание и включает реальные результаты тестов для иллюстрации деталей.


У меня сегодня нет воспроизводимых реальных результатов тестов. Но у меня есть хорошая история и немного реальных данных.

Continue reading "Нулевая задержка autovacuum_vacuum_cost_delay - вас сметёт лавина записи"

EXPLAIN ANALYZE в PostgreSQL - практическое руководство для веб-разработчиков

Пересказ статьи Vishu Bommoju. EXPLAIN ANALYZE in PostgreSQL — A Practical Guide for Web Developers


Большинство медленных веб-приложений тормозят не из-за плохих фреймворков или плохих серверов.
Они виснут из-за медленных запросов к базам данных.

PostgreSQL дает нам одно оружие, которое важнее почти всего остального при отладке производительности:

EXPLAIN ANALYZE

В этой статье объясняется EXPLAIN ANALYZE с точки зрения его практического использования, а не как теория из учебника.

Continue reading "EXPLAIN ANALYZE в PostgreSQL - практическое руководство для веб-разработчиков"

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

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


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

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

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

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


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


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

Continue reading "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 сделало в ответ и как убедиться, что это никогда не повторится с вами.

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

Внутреннее устройство 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 обрабатывает транзакции из памяти на диск, как он избегает дорогих операций ввода-вывода, и как он элегантно восстанавливает данные после сбоя. Continue reading "Внутреннее устройство WAL в PostgreSQL для инженеров данных"

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

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

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


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



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

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

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


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

Continue reading "Как быстро освоить 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. Такая конфигурация обеспечит автоматическое переключение при сбоях, простое масштабирование и упрощённое обслуживание.

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