Сервис развивается: тестируем формат, собираем идеи, улучшаем сервис. Есть идеи?

Написать
Войти
Дайджесты
Иллюстрация к статье о релизе Autobase 2.10 и конструкции PostgreSQL FILTER

Новости PostgreSQL: релиз платформы Autobase 2.10 и использование конструкции FILTER для агрегации за один проход

Команда проекта Autobase выпустила версию 2.10 с UI-управлением переключением отказоустойчивого кластера PostgreSQL и новыми Ansible-плейбуками для Patroni. Дайджест дополнен практическим разбором конструкции FILTER (WHERE ...), позволяющей вычислять агрегаты в один проход таблицы.

Новости PostgreSQL: релиз платформы Autobase 2.10 и использование конструкции FILTER для агрегации за один проход

Свободная СУБД PostgreSQL остается главным стандартом для хранения данных в современной бэкенд-разработке и системном администрировании. Развитие экосистемы охватывает как высокоуровневые инструменты оркестрации инфраструктуры, так и элегантные возможности языка SQL, позволяющие оптимизировать написание и выполнение повседневных аналитических запросов.

Настоящий дайджест разбирает два важных нововведения из мира PostgreSQL: официальный релиз управляющей платформы Autobase версии 2.10 и применение стандарта условной агрегации через синтаксическую конструкцию FILTER (WHERE ...), кардинально упрощающей SQL-код и повышающей его читаемость.

Релиз платформы Autobase 2.10: отказоустойчивость и переключение кластера в UI

Разработчики открытой управляющей платформы Autobase представили релиз версии 2.10. Продукт разработан для автоматизации полного жизненного цикла отказоустойчивых кластеров PostgreSQL в корпоративной среде и предлагает удобный графический интерфейс (UI) для системных администраторов и инженеров DevOps.

Ключевые фичи и улучшения релиза Autobase 2.10 включают:

  • Управление ручным переключением (Switchover) из UI: администраторы получили возможность инициировать плановую смену первичного узла (Primary) на реплику в один клик прямо из веб-консоли без необходимости ввода CLI-команд Patroni.
  • Поддержка локальных дисков и томов: добавлены новые политики распределения пространств хранения данных с прозрачным мониторингом использования дисков каждого узла кластера.
  • Интеграция с локальными кэшами: улучшена устойчивость работы визуального интерфейса при краткосрочных сетевых изоляциях отдельных нод.

Автоматизация инфраструктуры PostgreSQL: новейшие Ansible-плейбуки для Patroni

Важной частью обновления Autobase 2.10 стал развертываемый комплект готовых Ansible-плейбуков для разворачивания высокой доступности на базе Patroni и etcd.

Инфраструктурный стек позволяет развернуть прод-готовную конфигурацию PostgreSQL кластера из нескольких узлов за считанные минуты:

  1. Автоматическая подготовка узлов, настройка брандмауэра и системных параметров ядра Linux (sysctl.conf).
  2. Развертывание консенсус-хранилища etcd для хранения состояния кластера и выбора лидера.
  3. Установка PostgreSQL, Patroni daemon и утилиты patronictl.
  4. Автоматическое конфигурирование потоковой репликации и виртуального IP (VIP) через Keepalived или HAProxy для прозрачной перемаршрутизации приложения при смене мастера.

Синтаксическая оптимизация SQL: проблема условной агрегации через CASE

Помимо разворачивания инфраструктуры, разработчикам ежедневно приходится писать SQL-запросы для получения агрегированных бизнес-метрик. Часто возникающей задачей является подсчет нескольких различных показателей по разным условиям в рамках одного запроса.

Исторически для этого применялась конструкция SUM(CASE WHEN ... THEN 1 ELSE 0 END) или COUNT(CASE WHEN ... THEN 1 END):

-- УСТАРЕВШИЙ ПОДХОД: использования CASE внутри агрегатных функций
SELECT 
    dept_id,
    COUNT(CASE WHEN status = 'active' THEN 1 END) AS active_count,
    COUNT(CASE WHEN status = 'pending' THEN 1 END) AS pending_count,
    SUM(CASE WHEN status = 'active' THEN salary ELSE 0 END) AS active_salary
FROM employees
GROUP BY dept_id;

Хотя такой код работает корректно, он отличается избыточностью, снижает читаемость и заставляет СУБД выполнять громоздкое вычисление условных веток для каждой строки таблицы.

Элегантная агрегация за один проход с помощью предложения FILTER (WHERE ...)

Начиная с версии PostgreSQL 9.4 в СУБД была внедрена поддержка стандарта ANSI SQL FILTER (WHERE ...). Данное предложение прикрепляется непосредственно к агрегатным функциям (COUNT, SUM, AVG, ARRAY_AGG и др.) и отсекает строки, не соответствующие условию, до передачи их в агрегатор.

Тот же самый запрос с применением предложения FILTER выглядит следующим образом:

-- СОВРЕМЕННЫЙ ПОДХОД: использование предложение FILTER (WHERE ...)
SELECT 
    dept_id,
    COUNT(*) FILTER (WHERE status = 'active') AS active_count,
    COUNT(*) FILTER (WHERE status = 'pending') AS pending_count,
    SUM(salary) FILTER (WHERE status = 'active') AS active_salary
FROM employees
GROUP BY dept_id;

Преимущества использования конструкции FILTER:

  • Высокая читаемость: код становится намного чище и нагляднее выражает намерение разработчика.
  • Один проход по таблице: оптимизатор PostgreSQL выполняет сканирование таблицы ровно один раз, параллельно вычисляя фильтры для каждого агрегата.
  • Универсальность: FILTER работает со всеми агрегатными функциями, включая массивные агрегаторы jsonb_agg() и string_agg().

Практические примеры применения FILTER в аналитических SQL-запросах

Рассмотри более сложный аналитический пример — формирование финансового отчета по заказам интернет-магазина за текущий месяц:

SELECT 
    category_id,
    COUNT(*) AS total_orders,
    COUNT(*) FILTER (WHERE payment_status = 'paid') AS paid_orders,
    COUNT(*) FILTER (WHERE payment_status = 'refunded') AS refunded_orders,
    AVG(total_amount) FILTER (WHERE payment_status = 'paid') AS avg_paid_check,
    COALESCE(JSONB_AGG(order_id) FILTER (WHERE total_amount > 10000), '[]'::jsonb) AS vip_orders
FROM orders
WHERE created_at >= '2026-08-01'
GROUP BY category_id;

Обратите внимание на использование COALESCE вокруг JSONB_AGG: если ни одна строка не попала под условие фильтра, агрегат возвращает NULL, поэтому обертка COALESCE гарантирует возврат пустого JSON-массива []. Планировщик PostgreSQL формирует оптимальный план выполнения с мгновенной фильтрацией значений прямо в цикле агрегирования, избегая накладных расходов на вычисление условий CASE.

Резюме и выводы: эволюция администрирования и написания запросов в PostgreSQL

Выход платформы Autobase 2.10 и активное внедрение стандартизированного синтаксиса FILTER отражают общую тенденцию в мире PostgreSQL — снижение операционной сложности. Инженеры DevOps получают готовые визуальные инструменты и Ansible-плейбуки для управления высокой доступностью, а разработчики — лаконичные синтаксические возможности для эффективной работы с данными.