MVCC объясняет, почему строки в базе не перезаписываются, а накапливают версии и почему таблица может расти, даже если количество записей не изменилось. Сегодня в гайде:
• Как возникают версии строк при UPDATE;
• Почему длинные транзакции удерживают старые данные;
• Откуда появляется bloat и как он влияет на индексы.
Эта механика напрямую влияет на производительность, видимость данных и работу
VACUUM под нагрузкой.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 позволяет эффективно искать по неуникальным полям.На картинке — основные типы индексов, которые должен знать каждый разработчик, чтобы уверенно работать с производительностью запросов.
Сохрани, чтобы не забыть!
Please open Telegram to view this post
VIEW IN TELEGRAM
👍14❤8🔥7
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: частичный откат без пересборки всей транзакции!
При работе с многошаговыми транзакциями важно уметь откатывать только часть выполненных действий.
Создаём таблицу:
Добавляем первую операцию:
Фиксируем точку сохранения:
Выполняем шаг, который формально корректен, но позже мы решаем его отменить (например, неверная сумма):
Понимаем, что значение было ошибочным, и откатываемся к точке сохранения, не трогая всю транзакцию целиком:
Выполняем корректную альтернативу:
Фиксируем изменения и проверяем результат:
🔥 Такой подход позволяет в одной транзакции безопасно откатывать только ошибочные шаги, сохраняя корректные операции.
➡️ SQL Ready | #практика
При работе с многошаговыми транзакциями важно уметь откатывать только часть выполненных действий.
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;
Please open Telegram to view this post
VIEW IN TELEGRAM
❤14👍8🔥6🤝1
Смоделируем работу очереди, где задачи приходят в разное время и имеют разные уровни приоритета, нужно определить, кто будет обслужен раньше.
В этом посте:
• Разберём, как упорядочить поток задач так, чтобы высокий приоритет перехватывал очередь;
• Построим механизм, который при равных приоритетах будет соблюдать FIFO и не нарушать логику поступления задач;
• Получим итоговый порядок обработки.
Техника помогает понять, как моделировать поведение планировщиков, прогнозировать задержки и анализировать нагрузку.
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥13👍12❤7🤝1
Знали, как найти отличия между двумя версиями таблицы?
SQL умеет находить уникальные строки сам:
Получите все строки, которые появились или были изменены.
Нужно увидеть удалённые строки? Поменяйте местами таблицы:
Хотите собрать все расхождения одной командой - и добавленные, и удалённые:
🔥 Теперь видно список всех отличий с указанием, что именно произошло: добавилось или исчезло.
➡️ SQL Ready | #совет
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
);
Please open Telegram to view this post
VIEW IN TELEGRAM
❤19👍12🔥11
Набор приёмов, которые помогают уменьшить размер базы, ускорить выборки и точнее управлять её поведением: компактные таблицы без rowid, выборочные индексы, указание нужного индекса, очистка и пересборка через VACUUM, настройка страниц и кэша, а также анализ плана выполнения запросов. Подходит для локальных систем, аналитики, мобильных и встроенных приложений.Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
👍11🔥8❤7🤝1