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

Автор: @energy_it

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

Реклама на бирже: https://telega.in/c/sql_ready
Download Telegram
Нужно сделать очередь задач, чтобы несколько воркеров могли брать задания параллельно?

FOR UPDATE SKIP LOCKED — флаг, который позволяет захватить строку, а занятые другими процессами — пропустить, не ожидая их.
SELECT id
FROM jobs
WHERE taken_at IS NULL
ORDER BY created_at
FOR UPDATE SKIP LOCKED
LIMIT 1;


Сделаем атомарный захват задачи:
UPDATE jobs
SET taken_at = now()
WHERE id = ( ... тот самый SELECT ... )
RETURNING *;


Если задача взята, она возвращается. Если другой воркер схватил её раньше — SELECT просто пропустит её.

Можно добавить таймаут на незавершённые задачи:
WHERE taken_at IS NULL
OR taken_at < now() - interval '5 minutes'


🔥 Это превращает таблицу в настоящую надёжную очередь.

➡️ SQL Ready | #совет
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥159👍8
🖥 MVCC — что реально происходит при UPDATE!

MVCC объясняет, почему строки в базе не перезаписываются, а накапливают версии и почему таблица может расти, даже если количество записей не изменилось.

Сегодня в гайде:
Как возникают версии строк при UPDATE;

Почему длинные транзакции удерживают старые данные;

Откуда появляется bloat и как он влияет на индексы.


Эта механика напрямую влияет на производительность, видимость данных и работу VACUUM под нагрузкой.

📣 SQL Ready | #гайд
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥19🤝9👍7
📂 Напоминалка для работы с индексами в базах данных!

Например, clustered index определяет физический порядок строк в таблице, а secondary index позволяет эффективно искать по неуникальным полям.

На картинке — основные типы индексов, которые должен знать каждый разработчик, чтобы уверенно работать с производительностью запросов.

Сохрани, чтобы не забыть!

SQL Ready | #ресурс
Please open Telegram to view this post
VIEW IN TELEGRAM
👍148🔥7
🖥 Индексы — ключ к быстрому SQL. Особенно полезны при большом объёме данных и частых фильтрациях!

Правильно выбранный тип и структура индекса значительно ускоряют SELECT-запросы, но могут замедлять INSERT и UPDATE. Всегда проверяй эффективность через EXPLAIN ANALYZE.

SQL Ready | #шпора
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
13🔥9👍6🤝3
SAVEPOINT: частичный откат без пересборки всей транзакции!

При работе с многошаговыми транзакциями важно уметь откатывать только часть выполненных действий. SAVEPOINT даёт такой контроль в большинстве СУБД. Пример ниже оформлен для Oracle, но принцип похож и в других диалектах.

Создаём таблицу:
CREATE TABLE operations (
id NUMBER GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
description VARCHAR2(200),
amount NUMBER(10,2) CHECK (amount > 0)
);


Добавляем первую операцию:
INSERT INTO operations (description, amount)
VALUES ('Initial payment', 150.00);


Фиксируем точку сохранения:
SAVEPOINT sp_step1;


Выполняем шаг, который формально корректен, но позже мы решаем его отменить (например, неверная сумма):
INSERT INTO operations (description, amount)
VALUES ('Wrong amount', 1000.00);


Понимаем, что значение было ошибочным, и откатываемся к точке сохранения, не трогая всю транзакцию целиком:
ROLLBACK TO sp_step1;


Выполняем корректную альтернативу:
INSERT INTO operations (description, amount)
VALUES ('Corrected entry', 75.00);


Фиксируем изменения и проверяем результат:
COMMIT;

SELECT * FROM operations;


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

➡️ SQL Ready | #практика
Please open Telegram to view this post
VIEW IN TELEGRAM
14👍8🔥6🤝1
🖥 Симуляция очереди: кто получит ресурс первым!

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

В этом посте:
Разберём, как упорядочить поток задач так, чтобы высокий приоритет перехватывал очередь;

Построим механизм, который при равных приоритетах будет соблюдать FIFO и не нарушать логику поступления задач;

Получим итоговый порядок обработки.


Техника помогает понять, как моделировать поведение планировщиков, прогнозировать задержки и анализировать нагрузку.

➡️ SQL Ready | #задача
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥13👍127🤝1
Знали, как найти отличия между двумя версиями таблицы?

SQL умеет находить уникальные строки сам:
SELECT * FROM snapshot_new
EXCEPT
SELECT * FROM snapshot_old;


Получите все строки, которые появились или были изменены.

Нужно увидеть удалённые строки? Поменяйте местами таблицы:
SELECT * FROM snapshot_old
EXCEPT
SELECT * FROM snapshot_new;


Хотите собрать все расхождения одной командой - и добавленные, и удалённые:
(
SELECT *, 'added' AS diff
FROM snapshot_new
EXCEPT
SELECT *, 'added'
FROM snapshot_old
)
UNION ALL
(
SELECT *, 'removed' AS diff
FROM snapshot_old
EXCEPT
SELECT *, 'removed'
FROM snapshot_new
);


🔥 Теперь видно список всех отличий с указанием, что именно произошло: добавилось или исчезло.

➡️ SQL Ready | #совет
Please open Telegram to view this post
VIEW IN TELEGRAM
19👍12🔥11