Как освободить место без удаления индексов или данных
Раз в несколько месяцев мы получаем предупреждения от системы мониторинга базы данных о том, что свободное место скоро закончится. Обычно мы просто выделяем больше места и забываем об этом, однако в этот раз мы были на карантине и система была нагружена меньше, чем обычно. И тут мы подумали, что это хорошая возможность провести чистку.
Начнем с конца: в итоге нам удалось освободить более чем 70 GB не оптимизированного и неиспользуемого пространства без удаления индексов и данных.
Используя обычные приемы, такие как перестроение индексов и таблиц, мы очистили много пространства, но затем одна удивительная находка помогла нам освободить дополнительно примерно 20 GB неиспользуемых индексированных значений.
▪ Читать
#postgresql
@sqlhub
Please open Telegram to view this post
VIEW IN TELEGRAM
👍6❤4🔥3
NULL 😳Мой коллега постоянно работает с базами данных и обнаружил это вчера на собственном горьком опыте.
Некоторым это может показаться неожиданным поведением для движков: #mysql, #postgresql.
Если вы хотите вывести
NULL, используйте `val != 'crazy' OR val IS NULL`
@sqlhubPlease open Telegram to view this post
VIEW IN TELEGRAM
👍24🔥5❤2🎉2
CASEТут ниже представлена попытка заNULLить значение, если оно равно чему-то.
, CASE WHEN sdate = '1900-01-01' THEN NULL ELSE sdate END sdate
, CASE WHEN mdate = '1900-01-01' THEN NULL ELSE mdate END mdate
Но ведь в PostgreSQL есть функция
nullif, которая делает ровно то же самое.NULLIF(значение1, значение2)Функция
NULLIF выдаёт значение NULL, если значение1 равно значение2; в противном случае она возвращает значение1. Это может быть полезно для реализации обратной операции к COALESCE. В частности, для примера, показанного выше:SELECT NULLIF(value, '(none)') ...В данном примере если
value равно (none), выдаётся null, а иначе возвращается значение value.То есть в примере выше можно переписать короче и понятнее:
, NULLIF(sdate, '1900-01-01') sdate
, NULLIF(mdate, '1900-01-01') mdate
#PostgreSQL
@sqlhub
Please open Telegram to view this post
VIEW IN TELEGRAM
👍25🔥5❤4
🌐 openHalo позволяет приложениям, написанным для MySQL, работать с PostgreSQL, предлагая при этом лучшую производительность, чем MySQL!
openHalo поддерживает диалект SQL MySQL и использует тот же протокол соединения, что позволяет легко адаптировать приложения с MySQL к openHalo с минимальными изменениями кода. Это значительно упрощает миграцию с MySQL 5.7 или новее на openHalo, делая процесс быстрее, безопаснее и экономичнее.
С openHalo вы получаете повышенную производительность без дополнительных усилий и затрат, особенно для сложных SQL-запросов. Вы можете продолжать использовать знакомые инструменты, команды и драйверы MySQL для разработки.
🔗 GitHub
#openHalo #MySQL #PostgreSQL #database #migration
@sqlhub
openHalo поддерживает диалект SQL MySQL и использует тот же протокол соединения, что позволяет легко адаптировать приложения с MySQL к openHalo с минимальными изменениями кода. Это значительно упрощает миграцию с MySQL 5.7 или новее на openHalo, делая процесс быстрее, безопаснее и экономичнее.
С openHalo вы получаете повышенную производительность без дополнительных усилий и затрат, особенно для сложных SQL-запросов. Вы можете продолжать использовать знакомые инструменты, команды и драйверы MySQL для разработки.
🔗 GitHub
#openHalo #MySQL #PostgreSQL #database #migration
@sqlhub
❤6🔥5👍2
Возможности
- Прослушивание изменений в PostgreSQL в режиме реального времени.
- Поддержка нескольких слотов репликации.
- Удобный вывод в формате JSON.
- Готов к использованию в качестве сервиса.
Пример использования
1. Создаём слот репликации:
SELECT * FROM pg_create_logical_replication_slot('test_slot', 'wal2json');
2. Запускаем wal-listener:
wal-listener --dsn "host=localhost port=5432 user=postgres dbname=test" --slot test_slot
3. Получаем JSON-объекты при изменениях в базе данных.
https://github.com/ihippik/wal-listener
#devops #девопс #PostgreSQL #sql
@sqlhub
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥7👍5❤2
🧠 SQL-задача с подвохом: "Невидимые дубликаты"
В таблице
🎯 Цель:
Найти количество уникальных пользователей, если:
- Регистр не учитывается (`alice` = `ALICE`)
- Пробелы игнорируются
- Для
— Убираются точки в имени
— Всё после
✅ SQL-решение:
🔍 Как это работает:
LOWER(TRIM(email)) — убираем пробелы и регистр
SPLIT_PART(..., '+', 1) — отрезаем всё после +
REGEXP_REPLACE(..., '\.', '', 'g') — удаляем точки
Считаем DISTINCT, чтобы получить число уникальных email'ов
🔥 Используй такие трюки для:
• антифрода
• чистки базы
• аналитики поведения пользователей
#SQL #PostgreSQL #Gmail #EmailNormalization #DevTools #AntiFraud #DataCleaning #Analytics
В таблице
users хранятся email-адреса пользователей. Некоторые юзеры регистрируются повторно, маскируя один и тот же email по-разному:| id | name | email |
|----|----------|--------------------------|
| 1 | Alice | alice@example.com |
| 2 | Bob | ALICE@EXAMPLE.COM |
| 3 | Charlie | alice@example.com |
| 4 | Dave | alice+promo@example.com |
| 5 | Eve | a.l.i.c.e@example.com |
🎯 Цель:
Найти количество уникальных пользователей, если:
- Регистр не учитывается (`alice` = `ALICE`)
- Пробелы игнорируются
- Для
@gmail.com: — Убираются точки в имени
— Всё после
+ отрезается✅ SQL-решение:
SELECT COUNT(DISTINCT normalized_email) AS unique_users
FROM (
SELECT
CASE
WHEN email ILIKE '%@gmail.com' THEN
REGEXP_REPLACE(
SPLIT_PART(SPLIT_PART(LOWER(TRIM(email)), '+', 1), '@', 1),
'\.', '', 'g'
) || '@gmail.com'
ELSE
LOWER(REPLACE(TRIM(email), ' ', ''))
END AS normalized_email
FROM users
) AS cleaned;
🔍 Как это работает:
LOWER(TRIM(email)) — убираем пробелы и регистр
SPLIT_PART(..., '+', 1) — отрезаем всё после +
REGEXP_REPLACE(..., '\.', '', 'g') — удаляем точки
Считаем DISTINCT, чтобы получить число уникальных email'ов
🔥 Используй такие трюки для:
• антифрода
• чистки базы
• аналитики поведения пользователей
#SQL #PostgreSQL #Gmail #EmailNormalization #DevTools #AntiFraud #DataCleaning #Analytics
👍10❤4
📦 Outbox — надёжная реализация outbox-паттерна на Go для микросервисов
Если твои сервисы пишут в базу и одновременно публикуют события в Kafka, RabbitMQ или другие брокеры — знай: без outbox-паттерна ты рискуешь потерять данные.
🔧
🧠 Что она делает:
1. Сохраняет событие в таблицу
2. Отдельный воркер читает сообщения и отправляет их в брокер
3. После успешной доставки — сообщение помечается как доставленное
💡 Особенности:
- Поддержка PostgreSQL
- Готовые адаптеры для Kafka и RabbitMQ
- Возможность использовать свой брокер (реализуй интерфейс)
- Поддержка сериализации / форматирования событий
- Использует
🧩 Подходит для:
- надёжной синхронизации БД ↔ событий
- микросервисов, где важна консистентность
- систем, где нужна повторная доставка без дублей
🔥 Отличный выбор, если ты хочешь atomic-публикацию событий без тяжёлых фреймворков и сервисов.
#Go #OutboxPattern #Kafka #RabbitMQ #Microservices #EventDriven #PostgreSQL
🔗 https://github.com/oagudo/outbox
@sqlhub
Если твои сервисы пишут в базу и одновременно публикуют события в Kafka, RabbitMQ или другие брокеры — знай: без outbox-паттерна ты рискуешь потерять данные.
🔧
Outbox — это лёгкая и удобная библиотека на Go, которая помогает сделать доставку сообщений атомарной и надёжной, без лишней сложности.🧠 Что она делает:
1. Сохраняет событие в таблицу
outbox в рамках транзакции2. Отдельный воркер читает сообщения и отправляет их в брокер
3. После успешной доставки — сообщение помечается как доставленное
💡 Особенности:
- Поддержка PostgreSQL
- Готовые адаптеры для Kafka и RabbitMQ
- Возможность использовать свой брокер (реализуй интерфейс)
- Поддержка сериализации / форматирования событий
- Использует
sqlx и стандартную database/sql🧩 Подходит для:
- надёжной синхронизации БД ↔ событий
- микросервисов, где важна консистентность
- систем, где нужна повторная доставка без дублей
🔥 Отличный выбор, если ты хочешь atomic-публикацию событий без тяжёлых фреймворков и сервисов.
#Go #OutboxPattern #Kafka #RabbitMQ #Microservices #EventDriven #PostgreSQL
🔗 https://github.com/oagudo/outbox
@sqlhub
❤5👍5🔥2
🌊📊 pg_lake: Postgres для Iceberg и хранилищ данных
🚀Основные моменты:
- Создание и модификация таблиц Iceberg с полными транзакционными гарантиями.
- Запрос и импорт данных из файлов в форматах Parquet, CSV, JSON.
- Экспорт результатов запросов обратно в облачные хранилища.
- Поддержка геопространственных форматов через GDAL.
- Использование встроенного типа данных для полуструктурированных данных.
📌 GitHub: https://github.com/Snowflake-Labs/pg_lake
#postgresql
pg_lake позволяет интегрировать файлы Iceberg и хранилищ данных в PostgreSQL, превращая его в полноценную lakehouse-систему. Поддерживает транзакции и быстрые запросы к таблицам Iceberg, а также работу с сырыми данными из облачных хранилищ, таких как S3.🚀Основные моменты:
- Создание и модификация таблиц Iceberg с полными транзакционными гарантиями.
- Запрос и импорт данных из файлов в форматах Parquet, CSV, JSON.
- Экспорт результатов запросов обратно в облачные хранилища.
- Поддержка геопространственных форматов через GDAL.
- Использование встроенного типа данных для полуструктурированных данных.
📌 GitHub: https://github.com/Snowflake-Labs/pg_lake
#postgresql
👍5❤4🔥2
🚀 Новый продвинутый планировщик заданий для PostgreSQL - лучше, чем cron
Если устал от cron и временных триггеров, обрати внимание на pg_timetable:
✅ Сильный: гибкий, надёжный, с богатым функционалом
✅ Легко настраивается, понятен и прозрачен
✅ Позволяет:
• запускать SQL-задачи по расписанию
• отслеживать их статус и history
• обеспечивать graceful restart и защиту от сбоев
Идеален для рабочих баз, сложной логики задач и критичных приложений.
📦 Репозиторий: https://github.com/cybertec-postgresql/pg_timetable
#golang #postgresql #devops #golang
Если устал от cron и временных триггеров, обрати внимание на pg_timetable:
✅ Сильный: гибкий, надёжный, с богатым функционалом
✅ Легко настраивается, понятен и прозрачен
✅ Позволяет:
• запускать SQL-задачи по расписанию
• отслеживать их статус и history
• обеспечивать graceful restart и защиту от сбоев
Идеален для рабочих баз, сложной логики задач и критичных приложений.
📦 Репозиторий: https://github.com/cybertec-postgresql/pg_timetable
#golang #postgresql #devops #golang
👍11❤4🔥2
XiYan-SQL - это open-source решение, позволяющее генерировать, анализировать и выполнять SQL-запросы с использованием больших языковых моделей. Инструмент ориентирован на ускорение исследования данных и автоматизацию рутинных операций, связанных с запросами к базе.
Ключевые возможности:
- Генерация SQL из естественного языка -пользователь формулирует задачу обычными словами, а система преобразует её в корректный SQL-запрос.
- Интерактивная работа с базой данных - запросы можно оперативно уточнять, редактировать и выполнять, получая быстрый цикл обратной связи.
- Поддержка нескольких СУБД - PostgreSQL, MySQL, SQLite и другие.
- 🛠️ Минимальная конфигурация - подходит для анализа данных, прототипирования и облегчения доступа к базе без сложной инфраструктуры.
Преимущества использования:
- Существенно снижает трудоёмкость написания сложных SQL-запросов.
- Упрощает работу аналитикам и разработчикам, которым важно быстро получать корректные результаты.
- Может выступать в роли интерактивного помощника для изучения структуры базы и построения отчётов.
🔗 Репозиторий: github.com/XGenerationLab/XiYan-SQL
@ai_machinelearning_big_data
#sql #llm #ai #opensource #database #datatools #postgresql
Please open Telegram to view this post
VIEW IN TELEGRAM
👍10❤6👎6🥰1