SQL Ready | Базы Данных
15.4K subscribers
1.2K photos
66 videos
2 files
578 links
Авторский канал про Базы Данных и SQL
Ресурсы, гайды, задачи, шпаргалки.
Информация ежедневно пополняется!

Автор: @energy_it

РКН: https://clck.ru/3QREBc

Реклама на бирже: https://telega.in/c/sql_ready
Download Telegram
Оптимистическая блокировка: обновляем данные без конфликтов!

Когда несколько пользователей редактируют одну запись, можно избежать конфликтов с помощью оптимистической блокировки — без явного FOR UPDATE.

Создаём таблицу с версией записи:
CREATE TABLE products (
id INT GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
name TEXT,
price DECIMAL(10,2),
version INT DEFAULT 1 NOT NULL
);


Выбираем запись для редактирования:
SELECT id, name, price, version
FROM products
WHERE id = 1;


Обновляем с проверкой версии:
UPDATE products
SET price = 199.99,
version = version + 1
WHERE id = 1
AND version = 1;


Если другой пользователь уже изменил эту строку, UPDATE не затронет ни одной записи — значит, версия изменилась, и данные устарели.

Приложение должно проверить, что rows_affected = 1, и при необходимости повторить попытку или показать сообщение об ошибке.

Проверяем результат:
SELECT * FROM products WHERE id = 1;


🔥 Такой подход предотвращает «потерю обновлений» без длительных блокировок чтения и подходит для большинства современных СУБД.

➡️ SQL Ready | #практика
Please open Telegram to view this post
VIEW IN TELEGRAM
👍1610🔥5🤝1
🖥 SQL-генерация полного набора домино!

Сегодня соберём 28 уникальных костяшек домино — только силами SQL. Без циклов и хранимых процедур, используя лишь CROSS JOIN и простое условие.

В этом посте:
Генерируем все пары чисел от 0 до 6;

Фильтруем зеркальные комбинации;

Получаем финальный набор костяшек в правильном порядке.


Такой приём пригодится не только для домино — он полезен в задачах комбинаторики, генерации тестовых данных и построения матриц связей.

➡️ SQL Ready | #задача
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
👍13🔥87🤝2
Нужно найти, где бронирования, подписки или сессии пересекаются по времени?

Два интервала пересекаются, если начало одного раньше конца другого, и наоборот:
a.start_at < b.end_at
AND b.start_at < a.end_at


Это условие покрывает все случаи перекрытий, даже частичных и вложенных.

Теперь объедини данные сами с собой:
SELECT a.id, b.id
FROM bookings a
JOIN bookings b
ON a.id < b.id
AND a.start_at < b.end_at
AND b.start_at < a.end_at;


a.id < b.id, чтобы не получить пары в обе стороны.

Хочешь анализировать бронирования по ресурсу? Добавь фильтр:
AND a.room_id = b.room_id


🔥 Теперь видно, какие заявки реально конфликтуют по времени.

➡️ SQL Ready | #совет
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥1411👍6🤝1
🖥 Oracle — псевдоколонки и их возможности!

Эта шпаргалка собирает основные псевдоколонки Oracle и показывает, как использовать их на практике: нумерация строк, доступ к физическому адресу, работа с иерархиями, определение листовых/корневых узлов, генерация UUID, отслеживание изменений по SCN и просмотр историй строк.

➡️ SQL Ready | #шпора
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
👍15🔥107🤝2
🔥24👍97😁1🤝1
🖥 Очередь без конфликтов!

SKIP LOCKED позволяет управлять конкурентным доступом на уровне строки, а не всей таблицы, поэтому воркеры не ждут друг друга и не создают лишних блокировок.

Сегодня в гайде:
 Забираем задачи параллельно и без конфликтов;

 Делаем атомарный “взять + обновить” в одном запросе;

 Распределяем очереди между воркерами под высокой нагрузкой.


Этот прием делает обработку задач масштабируемой даже при высоком параллелизме.

➡️ SQL Ready | #гайд
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥1911👍6🤝1
Сгенерированные колонки в PostgreSQL: ускоряем фильтры без лишних вычислений!

Когда одно и то же выражение постоянно считается в WHERE, запросы тормозят. В PostgreSQL это решается GENERATED ALWAYS AS … STORED — выражение вычисляется один раз и хранится как обычное поле.

Создаём таблицу с материализованным выражением:
CREATE TABLE events (
id BIGSERIAL PRIMARY KEY,
payload JSONB NOT NULL,
event_type TEXT GENERATED ALWAYS AS (payload->>'type') STORED
);


Теперь event_type больше не вычисляется на лету — значение лежит прямо в строке.

Фильтрация становится проще и быстрее:
SELECT id
FROM events
WHERE event_type = 'purchase';


Добавляем индекс:
CREATE INDEX idx_events_event_type
ON events(event_type);


Проверяем:
EXPLAIN ANALYZE
SELECT id
FROM events
WHERE event_type = 'purchase';


🔥 Должен быть Index Scan, без тяжёлых операций над JSONB. Сгенерированные колонки отлично подходят для повторяющихся вычислений:

➡️ SQL Ready | #практика
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥15👍107