Сегодня будем играть! База данных “задумывает” число от 1 до 10, а ты делаешь три попытки угадать его.
В задаче:
• Используем RANDOM() и FLOOR() для генерации числа;
• Проверяем догадки через CASE WHEN;
• Добавляем счётчик успехов, чтобы узнать, повезло ли на этот раз.
Так SQL превращается в мини-игру с логикой, состоянием и элементом удачи.
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
❤17🔥10👍9
Если таблица огромная, а фильтр почти всегда одинаковый — зачем индексировать всё подряд?
Вместо обычного индекса создаём частичный (partial index):
CREATE INDEX ON orders (user_id)
WHERE status = 'pending';
Так индекс строится только для строк, где
status = 'pending'. Остальные записи не попадают, база хранит меньше, ищет быстрее.Теперь этот запрос:
SELECT * FROM orders
WHERE status = 'pending' AND user_id = 42;
🔥 Применяйте
partial index для активных заказов, незавершённых задач, непрочитанных сообщений. Там, где фильтр стабильно повторяется.Please open Telegram to view this post
VIEW IN TELEGRAM
👍16🤝8🔥7❤1
TRANSACTION ISOLATION LEVEL — управление конкурентным доступом!
Когда несколько транзакций работают с одними данными, возможны проблемы. Уровень изоляции определяет, насколько строго СУБД защищает данные от таких эффектов.
Пример настройки перед транзакцией (зависит от СУБД):
Основные Уровни:
🔥 Правильный уровень изоляции обеспечивает предсказуемость и надёжность даже при высокой конкуренции.
➡️ SQL Ready | #практика
Когда несколько транзакций работают с одними данными, возможны проблемы. Уровень изоляции определяет, насколько строго СУБД защищает данные от таких эффектов.
Пример настройки перед транзакцией (зависит от СУБД):
SET TRANSACTION ISOLATION LEVEL READ COMMITTED;
BEGIN;
SELECT * FROM accounts WHERE id = 1;
Основные Уровни:
READ UNCOMMITTED — минимальная защита, возможны «грязные» чтения:SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
READ COMMITTED — предотвращает грязные чтения, но допускает неповторяемые и фантомные:SET TRANSACTION ISOLATION LEVEL READ COMMITTED;
REPEATABLE READ — одни и те же строки возвращают одинаковые значения в рамках транзакции (поведение с фантомами зависит от СУБД):SET TRANSACTION ISOLATION LEVEL REPEATABLE READ;
SERIALIZABLE — максимальная изоляция: транзакции выполняются так, будто идут строго последовательно.SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;
🔥 Правильный уровень изоляции обеспечивает предсказуемость и надёжность даже при высокой конкуренции.
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥12👍7🤝7
insert ... on conflict позволяет вставить данные и одновременно обработать дубликаты без дополнительных проверок. Если запись уже существует, то выполняется обновление, если нет - добавляется новая.Сегодня в посте:
• Как работает on conflict и псевдотаблица excluded;
• Как обновлять только изменившиеся поля;
• Как писать лаконичные и надёжные операции без лишних запросов.
Всё происходит атомарно, в одном шаге и без лишней логики на стороне приложения.
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
👍13❤11🔥9👎1
🔥13❤6👍6🤝1
В этой шпаргалке собраны основные команды языка определения данных, используемые для создания, изменения и удаления объектов базы данных: таблиц, столбцов, индексов и других элементов структуры. Они формируют архитектуру базы и позволяют гибко управлять её схемой. Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
👍18❤6🔥6
Индекс по выражению — ускоряй запросы без изменения схемы!
Часто запросы не используют индекс, хотя поле индексировано.
Причиной может быть функция в условии:
Даже если email проиндексирован, lower(email) ломает возможность использовать индекс.
Вариант решения - индекс по выражению (expression index):
Проверить можно через план запроса:
🔥 Теперь в плане
➡️ SQL Ready | #совет
Часто запросы не используют индекс, хотя поле индексировано.
Причиной может быть функция в условии:
SELECT * FROM users WHERE lower(email) = 'admin@example.com';
Даже если email проиндексирован, lower(email) ломает возможность использовать индекс.
Вариант решения - индекс по выражению (expression index):
CREATE INDEX users_lower_email_idx
ON users ((lower(email)));
Проверить можно через план запроса:
EXPLAIN ANALYZE
SELECT * FROM users WHERE lower(email) = 'admin@example.com';
🔥 Теперь в плане
Index Scan, а не Full Table Scan.Please open Telegram to view this post
VIEW IN TELEGRAM
👍14❤7🔥7👎1