Сокращение в Postgres:
👉 @SQLPortal
USING можно использовать вместо JOIN ... ON a.id = b.idSELECT DISTINCT
t.amount AS transaction_amount
FROM
accounts a
JOIN
transactions t USING (account_id)
WHERE
a.account_id = 1;
Please open Telegram to view this post
VIEW IN TELEGRAM
👍9
Создавайте новые разделы списка при вставке новых значений ключа раздела в Oracle SQL, указав таблицу как
или преобразуйте уже существующие таблицы с помощью
Майк Смитерс показывает, как это работает.
👉 @SQLPortal
PARTITION BY LIST ( ... ) AUTOMATIC
или преобразуйте уже существующие таблицы с помощью
ALTER TABLE ... SET PARTITIONING AUTOMATICМайк Смитерс показывает, как это работает.
Please open Telegram to view this post
VIEW IN TELEGRAM
The Anti-Kyte
Getting Oracle to Create List Partitions automatically
I recently inherited the support of an application that had been written on Oracle 11g. One of the maintenance tasks was to create a new set of partitions every so often so that records with a new …
Оператор CASE в Postgres
Преобразует данные в зависимости от условия.
Оператор CASE используется для изменения (трансформации) данных в зависимости от заданного условия.
Пример выше выбирает цену из таблицы products и добавляет вычисляемое поле price_tier.
Если price больше или равна 500, в это поле записывается 'Luxury'.
Результат сортируется по цене в порядке убывания.
👉 @SQLPortal
Преобразует данные в зависимости от условия.
SELECT
price,
CASE
WHEN price >= 500.00 THEN 'Luxury'
END AS price_tier
FROM
products
ORDER BY
price DESC;
Оператор CASE используется для изменения (трансформации) данных в зависимости от заданного условия.
Пример выше выбирает цену из таблицы products и добавляет вычисляемое поле price_tier.
Если price больше или равна 500, в это поле записывается 'Luxury'.
Результат сортируется по цене в порядке убывания.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍7
pg_flo — библиотека для потоковой обработки в PostgreSQL
Упрощает создание и выполнение потоковых операций прямо в PostgreSQL. Она предоставляет удобный интерфейс для работы с данными и отлично подходит для задач, где нужна последовательная обработка или сложные data pipeline-ы.
GitHub: github.com/pgflo/pg_flo
👉 @SQLPortal
Упрощает создание и выполнение потоковых операций прямо в PostgreSQL. Она предоставляет удобный интерфейс для работы с данными и отлично подходит для задач, где нужна последовательная обработка или сложные data pipeline-ы.
GitHub: github.com/pgflo/pg_flo
Please open Telegram to view this post
VIEW IN TELEGRAM
GitHub
GitHub - pgflo/pg_flo: Stream, transform, and route PostgreSQL data in real-time.
Stream, transform, and route PostgreSQL data in real-time. - pgflo/pg_flo
👍2
dx теперь показывает «версию по умолчанию» расширений рядом с установленной версией.
Можно сравнить версии, установленные бинарно, с записями в каталоге.
Быстрая команда
исправит это.
Postgres COALESCE() и NULLIF():
Преобразовать NULL в другое значение можно с помощью COALESCE():
Сделать наоборот — превратить не-NULL значение в NULL:
👉 @SQLPortal
Можно сравнить версии, установленные бинарно, с записями в каталоге.
Быстрая команда
ALTER EXTENSION postgis UPDATE
исправит это.
Postgres COALESCE() и NULLIF():
Преобразовать NULL в другое значение можно с помощью COALESCE():
select name, coalesce(favorite_food, 'not provided') from users;
Сделать наоборот — превратить не-NULL значение в NULL:
select name, nullif(favorite_food, 'pizza') from users;
Please open Telegram to view this post
VIEW IN TELEGRAM
❤5
Остерегайся фантомных чтений.
И в Postgres, и в MySQL возможно, что два одинаковых SELECT-запроса внутри одной и той же транзакции вернут разные результаты.
Представь, что у нас есть база и два клиента. Клиент A начинает транзакцию и делает SELECT всех заказов с суммой больше $100. Пока он выполняет другие запросы, клиент B вставляет новый заказ в таблицу и делает COMMIT. Потом клиент A снова выполняет тот же SELECT — и теперь видит новую строку, добавленную клиентом B!
Разрешено это или нет — зависит от уровня изоляции, который настроен.
В Postgres по умолчанию используется уровень READ COMMITTED, который допускает фантомные чтения. Каждый отдельный запрос видит консистентное состояние базы, но между запросами внутри одной транзакции могут появляться изменения, зафиксированные другими транзакциями.
Как и Postgres, MySQL поддерживает четыре уровня изоляции, которые можно настраивать. Более строгие уровни, вроде SERIALIZABLE, предотвращают фантомные чтения. Более «слабые», например READ COMMITTED, допускают их (по умолчанию в MySQL используется REPEATABLE READ).
Почему бы не использовать всегда SERIALIZABLE? Из-за производительности. Чем строже уровень изоляции, тем больше блокировок, и тем сильнее проседает перфоманс. Более «мягкие» уровни дают лучшую производительность, но ценой возможных неконсистентных данных.
👉 @SQLPortal
И в Postgres, и в MySQL возможно, что два одинаковых SELECT-запроса внутри одной и той же транзакции вернут разные результаты.
Представь, что у нас есть база и два клиента. Клиент A начинает транзакцию и делает SELECT всех заказов с суммой больше $100. Пока он выполняет другие запросы, клиент B вставляет новый заказ в таблицу и делает COMMIT. Потом клиент A снова выполняет тот же SELECT — и теперь видит новую строку, добавленную клиентом B!
Разрешено это или нет — зависит от уровня изоляции, который настроен.
В Postgres по умолчанию используется уровень READ COMMITTED, который допускает фантомные чтения. Каждый отдельный запрос видит консистентное состояние базы, но между запросами внутри одной транзакции могут появляться изменения, зафиксированные другими транзакциями.
Как и Postgres, MySQL поддерживает четыре уровня изоляции, которые можно настраивать. Более строгие уровни, вроде SERIALIZABLE, предотвращают фантомные чтения. Более «слабые», например READ COMMITTED, допускают их (по умолчанию в MySQL используется REPEATABLE READ).
Почему бы не использовать всегда SERIALIZABLE? Из-за производительности. Чем строже уровень изоляции, тем больше блокировок, и тем сильнее проседает перфоманс. Более «мягкие» уровни дают лучшую производительность, но ценой возможных неконсистентных данных.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍5🔥2
Совет по Postgres: если в запросах ты используешь NULLS FIRST или NULLS LAST, не забудь указать то же самое и при создании индекса.
👉 @SQLPortal
CREATE INDEX ... ON table_name (column_name DESC NULLS LAST);
Please open Telegram to view this post
VIEW IN TELEGRAM
👍8🔥1
This media is not supported in your browser
VIEW IN TELEGRAM
Меня часто спрашивают, каким редактором я пользуюсь для работы с Postgres, чтобы писать SQL-запросы и получать результаты. На деле большинство имеют в виду графический редактор. Но я до сих пор сижу в стандартном консольном клиенте — psql, который идёт вместе с самим Postgres.
Главное, почему он для меня удобен, это немного понимания, как с ним работать, и пара лёгких настроек. Если ты только начинаешь, одно из самых простых и полезных действий — задать переменную окружения
После этого можно открыть последний выполненный запрос в выбранном редакторе командой \e.
Так ты остаёшься внутри psql, подключён к базе, но редактируешь запросы в удобном тебе редакторе.
👉 @SQLPortal
Главное, почему он для меня удобен, это немного понимания, как с ним работать, и пара лёгких настроек. Если ты только начинаешь, одно из самых простых и полезных действий — задать переменную окружения
$EDITOR под свой любимый редактор. У меня локально стоит vim, но ты можешь указать sublime text, vscode или даже (брр) emacs.После этого можно открыть последний выполненный запрос в выбранном редакторе командой \e.
Так ты остаёшься внутри psql, подключён к базе, но редактируешь запросы в удобном тебе редакторе.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍12❤4🤔1
Зачем вообще нужны такие тулзы, как pgbouncer или pgcat, для Postgres? И что вообще значит transaction pooling?
Давай разберёмся на практике и посмотрим, как работает transaction pooling в pgcat.
👉 @SQLPortal
Давай разберёмся на практике и посмотрим, как работает transaction pooling в pgcat.
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 секунды так:
👉 @SQLPortal
Например, можно мониторить таблицу pg_stat_activity каждые 3 секунды так:
select * from pg_stat_activity; \watch 3
Please open Telegram to view this post
VIEW IN TELEGRAM
👍9🔥1
Когда-нибудь задумывался, как в SQL сделать выборку, где строки идут поочерёдно: мужчина, женщина, мужчина, женщина? Этот трюк отлично подойдёт для собесов в Deloitte, Accenture или любых задач, где нужно показать уверенное владение SQL.
Подход с ROW_NUMBER()
Пояснение:
Шаг 1. Разделяем сотрудников по полу и каждому присваиваем порядковый номер.
ROW_NUMBER() OVER (ORDER BY id) даёт каждому сотруднику свой номер внутри группы (мужчины отдельно, женщины отдельно).
Шаг 2. Назначаем позиции так, чтобы чередование сохранялось:
Мужчины: rn * 2 - 1 → нечётные позиции (1, 3, 5 …)
Женщины: rn * 2 → чётные позиции (2, 4, 6 …)
После сортировки по sort_order получаем порядок: Мужчина → Женщина → Мужчина → Женщина.
Шаг 3. Выводим итоговую выборку.
👉 @SQLPortal
Подход с 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. Выводим итоговую выборку.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍21
dbpill — это прокси для Postgres, который автоматизирует оптимизацию индексов, и теперь он в открытом доступе:
github.com/mayfer/dbpill
@SQLPortal
github.com/mayfer/dbpill
@SQLPortal
👍5❤2🤔1
Кроссплатформенный клиент базы данных, созданный на основе Rust и Svelte
https://github.com/vrmiguel/pgpad/
👉 @SQLPortal
https://github.com/vrmiguel/pgpad/
Please open Telegram to view this post
VIEW IN TELEGRAM
👍3❤2🔥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
Называется Outerbase Studio:
✓ Поддерживает MySQL, Postgres, SQLite и Mongo
✓ Работает с сервисами вроде Turso и Cloudflare D1
✓ Доступен для Web, macOS и Windows
✓ Бесплатный и с открытым исходным кодом
→ https://github.com/outerbase/studio
@SQLPortal
❤4👍3
Полезная находка: собрали в одном месте тестовые задания от разных компаний, включая и российский бигтех 😋
Там есть всё ( от Android и Python до SQL и фронтенда.) Отличный способ посмотреть, чего сейчас ждут от кандидатов и потренировать навыки на реальных задачах.
👉 @SQLPortal
Там есть всё ( от Android и Python до SQL и фронтенда.) Отличный способ посмотреть, чего сейчас ждут от кандидатов и потренировать навыки на реальных задачах.
Please open Telegram to view this post
VIEW IN TELEGRAM
Postgres и оператор :: для быстрой смены типов данных:
Вычитаем интервал:
Сравнение значений:
Округление до нужной точности:
👉 @SQLPortal
Вычитаем интервал:
SELECT '2025-10-15'::date - interval '3 days'
Сравнение значений:
SELECT * FROM sales WHERE amount::numeric > '1000'::numeric
Округление до нужной точности:
SELECT (10.0 / 3.0)::numeric(5, 2)
Please open Telegram to view this post
VIEW IN TELEGRAM
👍5🔥4
Это моя любимая статья про внутренности B-деревьев.
Джереми Коул работал с MySQL в Twitter, Google и Shopify. Один из самых прошаренных MySQL-инженеров в мире, а его блог просто кладезь полезной инфы.
@SQLPortal
Джереми Коул работал с MySQL в Twitter, Google и Shopify. Один из самых прошаренных MySQL-инженеров в мире, а его блог просто кладезь полезной инфы.
@SQLPortal
❤5
Большинство проблем с производительностью возникают не из-за плохих запросов.
А из-за кривых таблиц.
Каждый CREATE TABLE это решение, которое потом аукнется:
• типы данных
• индексы
• ограничения
• партиционирование
Мой друг Рауль, собрал то, чему его научили годы проектирования и перепроектирования баз.
Почему реальная производительность начинается именно со схемы.
Читать тут → ссылка
@SQLPortal
А из-за кривых таблиц.
Каждый CREATE TABLE это решение, которое потом аукнется:
• типы данных
• индексы
• ограничения
• партиционирование
Мой друг Рауль, собрал то, чему его научили годы проектирования и перепроектирования баз.
Почему реальная производительность начинается именно со схемы.
Читать тут → ссылка
@SQLPortal
👍6
Важные индексы в Postgres
👉 @SQLPortal
🔸 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 будет слишком тяжелым
Часто используется для данных по временным сериям
Please open Telegram to view this post
VIEW IN TELEGRAM
❤7
Резервное копирование PostgreSQL с несколькими местами хранения
https://github.com/RostislavDugin/postgresus/
👉 @SQLPortal
https://github.com/RostislavDugin/postgresus/
Please open Telegram to view this post
VIEW IN TELEGRAM
👍6🔥1
Please open Telegram to view this post
VIEW IN TELEGRAM
❤3