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

Связь: @devmangx

РКН: https://clck.ru/3H4Wo3
Download Telegram
dx теперь показывает «версию по умолчанию» расширений рядом с установленной версией.

Можно сравнить версии, установленные бинарно, с записями в каталоге.

Быстрая команда

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;


👉 @SQLPortal
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
Please open Telegram to view this post
VIEW IN TELEGRAM
👍5🔥2
Совет по Postgres: если в запросах ты используешь NULLS FIRST или NULLS LAST, не забудь указать то же самое и при создании индекса.

CREATE INDEX ... ON table_name (column_name DESC NULLS LAST);


👉 @SQLPortal
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.

Главное, почему он для меня удобен, это немного понимания, как с ним работать, и пара лёгких настроек. Если ты только начинаешь, одно из самых простых и полезных действий — задать переменную окружения $EDITOR под свой любимый редактор. У меня локально стоит vim, но ты можешь указать sublime text, vscode или даже (брр) emacs.

После этого можно открыть последний выполненный запрос в выбранном редакторе командой \e.

Так ты остаёшься внутри psql, подключён к базе, но редактируешь запросы в удобном тебе редакторе.

👉 @SQLPortal
Please open Telegram to view this post
VIEW IN TELEGRAM
👍124🤔1
Зачем вообще нужны такие тулзы, как 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