SQL Portal | Базы Данных
14.6K subscribers
713 photos
95 videos
41 files
579 links
Присоединяйтесь к нашему каналу и погрузитесь в мир баз данных

Связь: @devmangx

РКН: https://clck.ru/3H4Wo3
Download Telegram
Зачем вообще нужны такие тулзы, как pgbouncer или pgcat, для Postgres? И что вообще значит transaction pooling?

Давай разберёмся на практике и посмотрим, как работает transaction pooling в pgcat.

👉 @SQLPortal
Please open Telegram to view this post
VIEW IN TELEGRAM
5
This media is not supported in your browser
VIEW IN TELEGRAM
Команда \watch {n} в Postgres повторно выполняет тот же запрос каждые n секунд.

Например, можно мониторить таблицу pg_stat_activity каждые 3 секунды так:

select * from pg_stat_activity; \watch 3


👉 @SQLPortal
Please open Telegram to view this post
VIEW IN TELEGRAM
👍9🔥1
Когда-нибудь задумывался, как в SQL сделать выборку, где строки идут поочерёдно: мужчина, женщина, мужчина, женщина? Этот трюк отлично подойдёт для собесов в Deloitte, Accenture или любых задач, где нужно показать уверенное владение SQL.

Подход с ROW_NUMBER()

WITH Male AS (
SELECT id, EmpName, Gender, ROW_NUMBER() OVER (ORDER BY id) AS rn
FROM Employee
WHERE Gender = 'MALE'
),
Female AS (
SELECT id, EmpName, Gender, ROW_NUMBER() OVER (ORDER BY id) AS rn
FROM Employee
WHERE Gender = 'FEMALE'
),
pp AS (
SELECT id, EmpName, Gender, rn * 2 - 1 AS sort_order FROM Male
UNION ALL
SELECT id, EmpName, Gender, rn * 2 AS sort_order FROM Female
)
SELECT id, EmpName, Gender
FROM pp
ORDER BY sort_order;


Пояснение:

Шаг 1. Разделяем сотрудников по полу и каждому присваиваем порядковый номер.
ROW_NUMBER() OVER (ORDER BY id) даёт каждому сотруднику свой номер внутри группы (мужчины отдельно, женщины отдельно).

Шаг 2. Назначаем позиции так, чтобы чередование сохранялось:

Мужчины: rn * 2 - 1 → нечётные позиции (1, 3, 5 …)
Женщины: rn * 2 → чётные позиции (2, 4, 6 …)

После сортировки по sort_order получаем порядок: Мужчина → Женщина → Мужчина → Женщина.

Шаг 3. Выводим итоговую выборку.

👉 @SQLPortal
Please open Telegram to view this post
VIEW IN TELEGRAM
👍21
dbpill — это прокси для Postgres, который автоматизирует оптимизацию индексов, и теперь он в открытом доступе:

github.com/mayfer/dbpill

@SQLPortal
👍52🤔1
Кроссплатформенный клиент базы данных, созданный на основе Rust и Svelte

https://github.com/vrmiguel/pgpad/

👉 @SQLPortal
Please open Telegram to view this post
VIEW IN TELEGRAM
👍32🔥1🤔1
This media is not supported in your browser
VIEW IN TELEGRAM
Минималистичный клиент для SQL-баз данных

Называется Outerbase Studio:

✓ Поддерживает MySQL, Postgres, SQLite и Mongo
✓ Работает с сервисами вроде Turso и Cloudflare D1
✓ Доступен для Web, macOS и Windows
✓ Бесплатный и с открытым исходным кодом

https://github.com/outerbase/studio

@SQLPortal
4👍3
Полезная находка: собрали в одном месте тестовые задания от разных компаний, включая и российский бигтех 😋

Там есть всё ( от Android и Python до SQL и фронтенда.) Отличный способ посмотреть, чего сейчас ждут от кандидатов и потренировать навыки на реальных задачах.

👉 @SQLPortal
Please open Telegram to view this post
VIEW IN TELEGRAM
Postgres и оператор :: для быстрой смены типов данных:

Вычитаем интервал:

SELECT '2025-10-15'::date - interval '3 days'


Сравнение значений:

SELECT * FROM sales WHERE amount::numeric > '1000'::numeric


Округление до нужной точности:

SELECT (10.0 / 3.0)::numeric(5, 2)


👉 @SQLPortal
Please open Telegram to view this post
VIEW IN TELEGRAM
👍5🔥4
Это моя любимая статья про внутренности B-деревьев.
Джереми Коул работал с MySQL в Twitter, Google и Shopify. Один из самых прошаренных MySQL-инженеров в мире, а его блог просто кладезь полезной инфы.

@SQLPortal
5
Большинство проблем с производительностью возникают не из-за плохих запросов.

А из-за кривых таблиц.

Каждый CREATE TABLE это решение, которое потом аукнется:

• типы данных
• индексы
• ограничения
• партиционирование

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

Читать тут → ссылка

@SQLPortal
👍6
Важные индексы в Postgres

🔸B-tree
Числа или текст, которые можно упорядочить или сравнить
Обычно используются с < > = или ORDER BY

🔸Multi-column B-tree
Числа или текст, которые часто запрашивают вместе
Также называется составной индекс

🔸Partial index
WHERE в определении индекса, чтобы индексировать только часть строк
Часто используется для NULL или часто встречающегося значения

🔸Covering
В индексе хранится весь результат запроса
Часто B-tree, но могут быть и другие типы

🔸Expression
Результаты функций или вычислений по данным столбца сохраняются в индексе
Обычно B-tree, но возможны и другие типы

🔸GIN
Для составных или мультизначных типов данных вроде JSONB
Также подходит для вхождений или частичного поиска по тексту

🔸GiST
Геоданные для PostGIS
Также подойдет для диапазонов, поиска ближайшего соседа и полнотекстового поиска

🔸HNSW
Поиск похожести и соседей для векторных данных

🔸BRIN
Очень большие таблицы, где B-tree будет слишком тяжелым
Часто используется для данных по временным сериям


👉 @SQLPortal
Please open Telegram to view this post
VIEW IN TELEGRAM
7
Резервное копирование PostgreSQL с несколькими местами хранения

https://github.com/RostislavDugin/postgresus/

👉 @SQLPortal
Please open Telegram to view this post
VIEW IN TELEGRAM
👍6🔥1
This media is not supported in your browser
VIEW IN TELEGRAM
Postgres soundex: искать и фильтровать слова, которые звучат одинаково на слух.

👉 @SQLPortal
Please open Telegram to view this post
VIEW IN TELEGRAM
3
Совет по Postgres:

Можно использовать SIMILAR TO вместо набора отдельных LIKE.
Пример:

SELECT email FROM users
WHERE email SIMILAR TO '%(gmail|yahoo|hotmail)%.com';


Так запрос получается чище, особенно если список доменов длинный.

👉 @SQLPortal
Please open Telegram to view this post
VIEW IN TELEGRAM
👍15👀5
This media is not supported in your browser
VIEW IN TELEGRAM
Совет для тех, кто активно юзает функции в Postgres. Параметр track_functions умеет собирать статистику по вызовам функций и времени их работы. Почти как pg_stat_statements, только для функций.

👉 @SQLPortal
Please open Telegram to view this post
VIEW IN TELEGRAM
5
Так что, онлайн-апдейты не обязательны

EBR позволяет обновлять Oracle-приложения онлайн, без даунтайма.

Если у вас есть окно обслуживания и пользователи в это время не работают с системой, то можно продолжать офлайн-апгрейды. Но EBR всё равно делает жизнь легче, а пользователей счастливее.

🔸Улучшает опыт пользователей

Мой банк недоступен каждую ночь с 00:00 до 04:00 - это их окно обслуживания.
Мне чаще всего всё равно, но было бы приятнее, если бы сервис работал всегда.
Меньше даунтайма — лучше впечатление от сервиса.

🔸Улучшает жизнь разработчиков

С EBR апдейты можно делать когда удобно, а не по ночам и не по выходным.
Если что-то пошло не так > коллеги на месте, не надо никого будить.
Плюс фичи и фиксы выкатываются сразу, без ожидания редких окон обслуживания.

🔸Апдейты могут длиться сколько нужно

Не надо укладываться в пару часов и переживать что не успеем.
Можно начать утром, отвлечься на срочное, вернуться позже и закончить.
Промежуточные “кривые” объекты никому не мешают, пока они в новой (неэкспонированной) edition.

🔸Независимость от серверной части

Мы можем завершить работу над новой edition, включить её для сервиса,
а обновление приложений сделать позже - хоть через несколько дней.

🔸Гибкое включение

Не обязательно переключать всех сразу:
можно начать с тестового сервера, реальные пользователи остаются на старой версии.
Даже разные типы серверов могут использовать разные edition, если не все готовы обновиться.

EBR это не только про снижение даунтайма.

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

👉 @SQLPortal
Please open Telegram to view this post
VIEW IN TELEGRAM
5
Postgres хранит данные кусками по 8 кБ для внутреннего управления хранилищем и памятью.

Page: так называется единица данных в области памяти Postgres (примерно соответствует RAM).

Block: так называется единица данных в файлах на диске (примерно соответствует Storage).

👉 @SQLPortal
Please open Telegram to view this post
VIEW IN TELEGRAM
👍5
Запускайте SQL-запросы прямо на сайте! 🤙 SQL Workbench Embedded — лёгкая (<10kb) и хорошо настраиваемая обёртка над duckdb :

https://embedded.sql-workbench.com/

👉 @SQLPortal
Please open Telegram to view this post
VIEW IN TELEGRAM
4👍2🤯2
Для тех, кто работает с JSON в Postgres: JSONB_OBJECT_KEYS позволяет заглянуть в структуру внутри неструктурированных данных.

Пример запроса:

SELECT DISTINCT key_name
FROM
(SELECT JSONB_OBJECT_KEYS(data) AS key_name FROM app_settings)
AS all_keys;


👉 @SQLPortal
Please open Telegram to view this post
VIEW IN TELEGRAM
👍5
От таймстампов к пониманию продуктивности: как посчитать рабочие часы за день для нескольких сотрудников с помощью SQL

Для аналитика одна из стандартных задач — посчитать ежедневные рабочие часы сотрудников на основе логов событий.

Как это работает:

1️⃣Сопоставляем Login и Logout события

Используем CTE (WITH paired) вместе с LEAD(), чтобы получить время следующего события для каждого логина.
Разбиваем данные по employee_id и дню, чтобы считать длительность отдельно по каждому сотруднику за каждый день.

2️⃣Фильтруем только логины

Берем только Login, чтобы посчитать время до следующего события (обычно Logout).

3️⃣Считаем длительность в часах

EXTRACT(EPOCH FROM (logout_time - login_time)) / 3600 переводит разницу во времени из секунд в часы.

4️⃣Агрегация часов за день

С помощью SUM() и GROUP BY получаем итоговые рабочие часы для каждого сотрудника за день.
Такой подход корректно работает с несколькими логин-логаут сессиями в течение дня, суммируя их в точное общее рабочее время.

👉 @SQLPortal
Please open Telegram to view this post
VIEW IN TELEGRAM
👍3
Postgres INNER JOIN и CROSS JOIN.

🚫 SELECT * FROM users, accounts; это CROSS JOIN и декартово произведение.

SELECT * FROM users u JOIN accounts a ON u.user_id = a.user_id; это INNER JOIN и он связывает таблицы по совпадающим строкам.

👉 @SQLPortal
Please open Telegram to view this post
VIEW IN TELEGRAM
👍5