SQL-фишка, о которой знают далеко не все
А вы знали, что внутри transaction можно создавать контрольные точки с помощью
Без
В этом случае будут отменены и заказ, и платёж.
С
Теперь можно откатить только неудачную часть transaction и продолжить работу с последней безопасной точки.
SAVEPOINT особенно полезен в сложных операциях, где полный откат и повторное выполнение всей transaction обходятся слишком дорого.
👉 @SQLPortal
А вы знали, что внутри transaction можно создавать контрольные точки с помощью
SAVEPOINT? Обычный ROLLBACK отменяет всю transaction. А SAVEPOINT позволяет создать точку, к которой можно откатиться, отменив только изменения, сделанные после неё.Без
SAVEPOINT:BEGIN;
INSERT INTO orders VALUES (1, 'Laptop');
INSERT INTO payments VALUES (1, 'FAILED');
-- Что-то пошло не так
ROLLBACK;
В этом случае будут отменены и заказ, и платёж.
С
SAVEPOINT:BEGIN;
INSERT INTO orders VALUES (1, 'Laptop');
SAVEPOINT before_payment;
INSERT INTO payments VALUES (1, 'FAILED');
-- Платёж не прошёл
ROLLBACK TO SAVEPOINT before_payment;
-- Пробуем другой способ оплаты
INSERT INTO payments VALUES (1, 'SUCCESS');
COMMIT;
Теперь можно откатить только неудачную часть transaction и продолжить работу с последней безопасной точки.
SAVEPOINT особенно полезен в сложных операциях, где полный откат и повторное выполнение всей transaction обходятся слишком дорого.
SAVEPOINT не предотвращает ошибку. Он просто помогает не откатывать всю работу из-за одной неудачной операции.Please open Telegram to view this post
VIEW IN TELEGRAM
👍5
Проверка уникальности работает через
Postgres не может доказать равенство двух
Простой пример, где это ломается, — составной ключ:
В итоге можно получить две активные записи membership для одного и того же пользователя, потому что ограничение уникальности вообще не срабатывает.
Начиная с Postgres 15, уникальные ограничения и индексы могут считать
Второй
Но это также запретит две строки с одинаковым значением
Частичный уникальный индекс
Если уникальность нужно обеспечить только для активных строк, используйте partial unique index:
👉 @SQLPortal
=, а NULL = NULL не даёт true. По умолчанию NULL не считается уникальным значением.Postgres не может доказать равенство двух
NULL, поэтому пропускает обе строки.Простой пример, где это ломается, — составной ключ:
-- UNIQUE (user_id, org_id, deleted_at)
INSERT INTO memberships VALUES (1, 10, NULL);
INSERT INTO memberships VALUES (1, 10, NULL);
-- обе строки будут вставлены
В итоге можно получить две активные записи membership для одного и того же пользователя, потому что ограничение уникальности вообще не срабатывает.
NULLS NOT DISTINCTНачиная с Postgres 15, уникальные ограничения и индексы могут считать
NULL равными:UNIQUE NULLS NOT DISTINCT (user_id, org_id, deleted_at)
Второй
INSERT уже завершится ошибкой.Но это также запретит две строки с одинаковым значением
deleted_at, а не только две активные строки.Частичный уникальный индекс
Если уникальность нужно обеспечить только для активных строк, используйте partial unique index:
CREATE UNIQUE INDEX ON memberships (user_id, org_id)
WHERE deleted_at IS NULL;
Please open Telegram to view this post
VIEW IN TELEGRAM
❤2🔥1
Самый чистый способ получить последнюю запись для каждого пользователя
Можно фильтровать результаты window functions, таких как
Вместо:
Можно написать:
👉 @SQLPortal
Можно фильтровать результаты window functions, таких как
ROW_NUMBER() или RANK(), напрямую — без дополнительного subquery или CTE.Вместо:
WITH ranked AS (
SELECT *,
ROW_NUMBER() OVER (
PARTITION BY user_id
ORDER BY timestamp DESC
) AS rn
FROM events
)
SELECT *
FROM ranked
WHERE rn = 1;
Можно написать:
SELECT *
FROM events
QUALIFY ROW_NUMBER() OVER (
PARTITION BY user_id
ORDER BY timestamp DESC
) = 1;
QUALIFY особенно удобен для deduplication, выбора последних записей и очистки данных. Он заметно уменьшает вложенность запросов и делает SQL проще для чтения. Только не забудьте проверить, поддерживает ли ваша СУБД QUALIFY.Please open Telegram to view this post
VIEW IN TELEGRAM
👍2❤1
Please open Telegram to view this post
VIEW IN TELEGRAM
Продвинутый планировщик задач, который живёт в экосистеме PostgreSQL
Утилита полностью управляемая через базу без серверных конфигов. Поддерживает пайплайны задач, запуск SQL и внешних команд, умные ретраи после сбоев и контроль параллельного запуска тяжёлых джобов.
👉 @SQLPortal
Утилита полностью управляемая через базу без серверных конфигов. Поддерживает пайплайны задач, запуск SQL и внешних команд, умные ретраи после сбоев и контроль параллельного запуска тяжёлых джобов.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2
UPDATE — оператор обновления данных в MySQL 🗂️
Если в таблице нужно изменить значение в уже существующей строке, используют команду UPDATE. Она позволяет обновлять записи точечно, но важно правильно задать условие: без него изменения могут затронуть всю таблицу.
Этот запрос меняет значение price только у записи с id = 1.
С помощью UPDATE можно изменить сразу несколько полей:
Этот запрос обновляет параметры price и quantity у записи с id = 2.
💡 UPDATE используют, когда нужно:
➖ изменить значение в конкретной записи,
➖ обновить несколько полей за один запрос,
➖ выбрать строки по условию,
➖ массово изменить набор записей.
🔗 SQL — это база для работы с базами.
Если хотите не просто понять одну команду, а уверенно собирать запросы и менять данные без ошибок, регистрируйтесь на бесплатный мини-курс «MySQL для новичков» от Академии Selectel➡️
Программа состоит из коротких уроков, которые помогут пройти путь от установки и настройки СУБД до создания таблиц, управления пользователями и основных операций с данными.
Реклама. АО "Селектел". erid:2W5zFHrsApy
Если в таблице нужно изменить значение в уже существующей строке, используют команду UPDATE. Она позволяет обновлять записи точечно, но важно правильно задать условие: без него изменения могут затронуть всю таблицу.
UPDATE products
SET price = 50500
WHERE id = 1;
Этот запрос меняет значение price только у записи с id = 1.
С помощью UPDATE можно изменить сразу несколько полей:
UPDATE products
SET price = 78500, quantity = 3
WHERE id = 2;
Этот запрос обновляет параметры price и quantity у записи с id = 2.
Если хотите не просто понять одну команду, а уверенно собирать запросы и менять данные без ошибок, регистрируйтесь на бесплатный мини-курс «MySQL для новичков» от Академии Selectel
Программа состоит из коротких уроков, которые помогут пройти путь от установки и настройки СУБД до создания таблиц, управления пользователями и основных операций с данными.
Реклама. АО "Селектел". erid:2W5zFHrsApy
Please open Telegram to view this post
VIEW IN TELEGRAM
❤1
Вы создали composite index:
А затем выполнили запрос:
Результат? База данных проигнорировала index и выполнила Sequential Scan.
Почему? Разве index не должен использоваться, ведь
А что изменится для следующих условий?
Понимание порядка столбцов в composite indexes — одна из важнейших тем SQL performance optimization, которую стоит знать каждому backend-разработчику.
👉 @SQLPortal
(first_name, last_name, city)
А затем выполнили запрос:
SELECT *
FROM users
WHERE last_name = 'Smith';
Результат? База данных проигнорировала index и выполнила Sequential Scan.
Почему? Разве index не должен использоваться, ведь
last_name входит в него?А что изменится для следующих условий?
WHERE first_name = ?
WHERE first_name = ? AND last_name = ?
WHERE first_name = ? AND city = ?
Понимание порядка столбцов в composite indexes — одна из важнейших тем SQL performance optimization, которую стоит знать каждому backend-разработчику.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍1
Интервьюер:
Зачем в SQL нужен
👉 @SQLPortal
Зачем в SQL нужен
EXISTS, если уже есть IN? Разве они не делают одно и то же?Please open Telegram to view this post
VIEW IN TELEGRAM
❤2🤔2
А сможете ответить на вопрос по данным без SQL-запроса? 🤔
До выполнения запроса данные нужно получить из источников, сопоставить, проверить и подготовить. Если эти этапы распределены между разными системами, значительная часть времени уходит на передачу данных и поддержку интеграций.
DataLens Platform объединяет загрузку, lakehouse-хранилище, обработку, SQL-запросы и визуализацию. Интерактивные запросы выполняются с помощью Trino, ресурсоемкие преобразования — с помощью Spark.
К подготовленным данным можно обращаться через SQL, отчёты и ИИ-помощника. Каталог метаданных позволяет увидеть происхождение показателей, а общая модель доступа ограничивает работу пользователя его правами.
Хранение и вычислительные мощности масштабируются независимо.
👉 Подробнее о DataLens Platform — в материале СМИ.
До выполнения запроса данные нужно получить из источников, сопоставить, проверить и подготовить. Если эти этапы распределены между разными системами, значительная часть времени уходит на передачу данных и поддержку интеграций.
DataLens Platform объединяет загрузку, lakehouse-хранилище, обработку, SQL-запросы и визуализацию. Интерактивные запросы выполняются с помощью Trino, ресурсоемкие преобразования — с помощью Spark.
К подготовленным данным можно обращаться через SQL, отчёты и ИИ-помощника. Каталог метаданных позволяет увидеть происхождение показателей, а общая модель доступа ограничивает работу пользователя его правами.
Хранение и вычислительные мощности масштабируются независимо.
👉 Подробнее о DataLens Platform — в материале СМИ.
❤1
База данных может обрабатывать миллионы строк...
Но всего один плохой SQL-запрос способен серьёзно просадить её производительность.
Большинство проблем с SQL performance связаны с:
•
• Отсутствующими indexes
• Неоптимальными
• Full Table Scan
• Игнорированием
Вот SQL Optimization Cheat Sheet, который поможет писать более быстрые и эффективные запросы. Сохраните — пригодится во время следующего performance tuning.
👉 @SQLPortal
Но всего один плохой SQL-запрос способен серьёзно просадить её производительность.
Большинство проблем с SQL performance связаны с:
•
SELECT *• Отсутствующими indexes
• Неоптимальными
JOIN• Full Table Scan
• Игнорированием
EXPLAINВот SQL Optimization Cheat Sheet, который поможет писать более быстрые и эффективные запросы. Сохраните — пригодится во время следующего performance tuning.
Please open Telegram to view this post
VIEW IN TELEGRAM
Вопрос с собеседования по отладке SQL
Этот запрос должен возвращать сотрудников, которые не состоят в неактивном отделе.
Что с ним не так? Будет ли он работать? Если нет, как его исправить?
👉 @SQLPortal
Этот запрос должен возвращать сотрудников, которые не состоят в неактивном отделе.
Что с ним не так? Будет ли он работать? Если нет, как его исправить?
Please open Telegram to view this post
VIEW IN TELEGRAM
👍1