SQL Ready | Базы Данных

SQL Ready | Базы Данных

@sql_ready

Авторский канал про Базы Данных и SQL Ресурсы, гайды, задачи, шпаргалки. Информация ежедневно пополняется! Автор: @energy_it РКН: https://clck.ru/3QREBc Реклама на бирже: https://telega.in/c/sql_ready

15 490подписчиков
🇷🇺

Похожие каналы

Все →

Последние посты

💅 Структурированный справочник по MySQL!Репозиторий представляет собой структурированную базу знаний по MySQL, где собраны как основы работы с базами данных, так и более сложные темы. Материал подан в формате конспекта, поэтому его удобно использовать и для изучения, и для быстрого повторения перед собеседованием или рабочими задачами.Оставляю ссылочку: GitHub 📱➡️ SQL Ready | #репозиторий

18 июн. 2026 г.1 510В Telegram

N+1 проблема в SQL: почему приложение внезапно начинает делать тысячи запросов!Одна из самых частых проблем backend-приложений — N+1 queries. Особенно часто это появляется при работе через ORM, потому что код выглядит нормально, а реальные SQL-запросы скрыты внутри слоя абстракции.Например, есть таблицы:users(id, name)orders(id, user_id, amount)Сначала приложение получает пользователей:SELECT id, nameFROM users;Допустим, запрос вернул 1000 пользователей. Дальше приложение начинает отдельно загружать заказы для каждого пользователя:SELECT id, user_id, amountFROM ordersWHERE user_id = ?;И этот запрос выполняется уже 1000 раз. То есть итоговая схема выглядит так: 1 запрос на получение users, N запросов на получение orders. Это и есть классическая N+1 problem.В ORM это обычно выглядит примерно так:users = User.objects.all()for user in users: orders = list(user.order_set.all()) print(orders)Внешне код выглядит абсолютно нормально, но внутри ORM может выполнять отдельный SELECT для каждого user.order_set.all().На маленьких объемах данных проблема почти незаметна. Но на продакшене начинают быстро расти: latency, network overhead, нагрузка на connection pool, время ответа API, нагрузка на БД.Особенно неприятно это проявляется при pagination, background jobs и high-load API. Обычно данные эффективнее загружать набором.Например, через JOIN:SELECT u.id, u.name, o.id, o.amountFROM users uLEFT JOIN orders o ON o.user_id = u.id;Либо через batch loading:SELECT id, user_id, amountFROM ordersWHERE user_id IN (?, ?, ?, ...);Во многих случаях batch loading даже эффективнее огромного JOIN, потому что JOIN может раздувать result set и создавать большое количество дублирующихся строк при one-to-many связях.Поэтому современные ORM обычно уже имеют встроенные механизмы борьбы с N+1.Например, в Django:User.objects.prefetch_related("order_set")User.objects.select_related("profile")prefetch_related() обычно используется для reverse FK и many-to-man

17 июн. 2026 г.1 330В Telegram

🧐 PostgreSQL в Selectel — статьи, гайды и практические кейсы по PostgreSQL!Это подборка материалов по PostgreSQL: настройка и администрирование баз данных, оптимизация запросов, репликация, резервное копирование, индексы, мониторинг и др. темы. Помимо теории, здесь много практических статей и кейсов, которые помогают лучше понять работу PostgreSQL и применять полученные знания. 📌 Оставляю ссылочку: selectel.ru➡️ SQL Ready | #ресурс

17 июн. 2026 г.1 340В Telegram
SQL Ready | Базы Данных — пост в ТГ канале

PostgreSQL умеет замораживать часть запроса и запрещать оптимизатору его разворачивать!Начиная с PostgreSQL 12 оптимизатор получил право разворачивать CTE прямо внутрь основного запроса.WITH data AS ( SELECT * FROM orders)SELECT *FROM dataWHERE user_id = 42;Такой WITH может вообще исчезнуть из плана выполнения, потому что PostgreSQL встроит его обратно в запрос. Но иногда это плохо.Например, если внутри CTE дорогой расчёт, который нельзя выполнять повторно. Тут появляется малоизвестная фича:WITH expensive AS MATERIALIZED ( SELECT * FROM huge_events WHERE created_at >= now() - interval '1 day')SELECT COUNT(*)FROM expensive;MATERIALIZED заставляет PostgreSQL сначала физически вычислить CTE, а потом использовать результат дальше.А обратная фича:WITH data AS NOT MATERIALIZED ( SELECT * FROM orders)SELECT *FROM dataWHERE user_id = 42;наоборот подсказывает оптимизатору агрессивно встраивать CTE обратно в запрос.🔥 Одна и та же CTE с MATERIALIZED и без него иногда отличается по производительности в десятки раз на больших объёмах данных.➡️ SQL Ready | #совет

16 июн. 2026 г.1 400В Telegram
SQL Ready | Базы Данных — пост в ТГ канале

📂 Напоминалка по проектированию систем!Например, кэширование помогает ускорить чтение и снизить нагрузку на БД, а CDN уменьшает задержки для пользователей из разных регионов.На картинке — 8 распространённых проблем проектирования систем и практические способы их решения: кэширование, балансировка нагрузки, репликация, шардинг, централизованное логирование и другие базовые архитектурные паттерны.Сохрани, чтобы не потерять!➡️ SQL Ready | #ресурс

15 июн. 2026 г.1 520В Telegram

🐱 SQL, MySQL и PostgreSQL — один из лучших материалов для изучения баз данных!Это обучающий материал с теорией, объяснениями и практическими задачами. Здесь разбираются устройство баз данных, связи между таблицами, индексы, нормализация, проектирование схем и многое др. Большой акцент сделан на понимании того, как правильно проектировать бд и решать задачи, которые часто встречаются на собеседованиях и в работе.Оставляю ссылочку: GitHub 📱➡️ SQL Ready | #репозиторий

11 июн. 2026 г.2 210В Telegram

Почему CHECK constraint может пропустить неправильные данные из-за NULL!Редкая, но неприятная ловушка SQL: многие думают, что CHECK constraint требует, чтобы условие всегда было TRUE. Но это не так, CHECK запрещает только FALSE. А результат UNKNOWN — пропускается.Именно поэтому nullable-колонки внутри CHECK могут вести себя не так, как ожидает разработчик.Допустим, есть таблица товаров:products( id, price, discount)Хотим запретить скидку больше цены:ALTER TABLE productsADD CONSTRAINT chk_discount_priceCHECK (discount <= price);На первый взгляд всё выглядит правильно.Теперь такой INSERT действительно не пройдёт:INSERT INTO products(id, price, discount)VALUES (1, 100, 150);Потому что проверка: 150 <= 100 даёт FALSE. А CHECK constraint запрещает строки, где выражение возвращает FALSE. Но дальше начинается важный нюанс SQL и трёхзначной логики.Вот такой INSERT уже может пройти:INSERT INTO products(id, price, discount)VALUES (2, 100, NULL);И такой тоже:INSERT INTO products(id, price, discount)VALUES (3, NULL, 50);Многие ожидают, что CHECK отклонит такие строки. Но SQL работает иначе, если в сравнении участвует NULL, результатом становится не TRUE и не FALSE, а: UNKNOWNТо есть:150 <= 100 -- FALSENULL <= 100 -- UNKNOWN50 <= NULL -- UNKNOWNNULL <= NULL -- UNKNOWNИ вот здесь самая важная мысль: CHECK constraint считает строку валидной, если результат выражения — TRUE или UNKNOWN. Запрещается только явно FALSE.Это поведение связано с SQL three-valued logic — логикой с тремя состояниями: TRUE, FALSE и UNKNOWN. Именно поэтому CHECK сам по себе НЕ заменяет NOT NULL. Если колонка обязательная — это нужно указывать отдельно.Правильный вариант:CREATE TABLE products( id bigint PRIMARY KEY, price numeric NOT NULL, discount numeric NOT NULL, CONSTRAINT chk_discount_price CHECK (discount <= price));Теперь NULL уже не сможет пройти, потому что NOT NULL сработает раньше CHECK. Но в реальных системах скидка часто может отсутствовать. То

10 июн. 2026 г.1 910В Telegram

🧐 SQL Tutorial — подробный гайд по SQL с примерами!На сайте собрано множество обучающих материал по SQL: от базовых запросов SELECT и WHERE до JOIN, подзапросов, функций, сортировки и работы с таблицами. Всё объясняется простым языком с примерами запросов и постепенным усложнением тем, поэтому материал подойдёт как новичкам, так и тем, кто хочет систематизировать знания по бд.📌 Оставляю ссылочку: ravesli.com➡️ SQL Ready | #ресурс

10 июн. 2026 г.1 600В Telegram
SQL Ready | Базы Данных — пост в ТГ канале

PostgreSQL умеет пропускать заблокированные строки без ожидания!Большинство знают SKIP LOCKED только для очередей через SELECT ... FOR UPDATE. Но мало кто использует его для параллельной пакетной обработки внутри PostgreSQL.Если несколько воркеров одновременно обрабатывают огромную таблицу задач:SELECT idFROM jobsWHERE processed = falseFOR UPDATE;Без SKIP LOCKED процессы начинают ждать друг друга даже при наличии свободных строк.PostgreSQL позволяет просто пропускать уже занятые записи:SELECT idFROM jobsWHERE processed = falseFOR UPDATE SKIP LOCKED;Теперь каждый воркер мгновенно получает только свободные строки без ожидания и конфликтов.Это можно встроить прямо в UPDATE:WITH cte AS ( SELECT id FROM jobs WHERE processed = false LIMIT 100 FOR UPDATE SKIP LOCKED)UPDATE jobsSET processed = trueWHERE id IN (SELECT id FROM cte);Получается параллельная обработка на уровне PostgreSQL без внешних систем очередей.🔥 Аналогично строят высоконагруженные фоновые обработчики, обработку писем, биллинг и массовые пакетные операции.➡️ SQL Ready | #совет

9 июн. 2026 г.1 670В Telegram
SQL Ready | Базы Данных — пост в ТГ канале

📂 Напоминалка по шардингу баз данных!Например, шардинг по диапазону распределяет данные по определённым диапазонам значений, а шардинг по хэшу помогает равномерно распределять нагрузку между серверами.На картинке — основные стратегии шардинга и маршрутизации запросов, которые используются в распределённых базах данных и высоконагруженных системах.Сохрани, чтобы не потерять! ➡️ SQL Ready | #ресурс

8 июн. 2026 г.1 900В Telegram

Антиджойн в SQL — как находить отсутствующие связи!Одна из самых частых задач в аналитике — найти строки, для которых не существует связанных данных. Например, пользователей без заказов или товары без продаж.Таблицы:users(id, email)orders(id, user_id)Многие пытаются писать через NOT IN:id="x8d2qa"SELECT *FROM usersWHERE id NOT IN ( SELECT user_id FROM orders);Но здесь есть проблема: если подзапрос вернёт хотя бы один NULL, результат может стать пустым.Причина — логика NULL в SQL ломает сравнение NOT IN.Решением может служить антиджойн через NOT EXISTS:id="m4z7pk"SELECT *FROM users uWHERE NOT EXISTS ( SELECT 1 FROM orders o WHERE o.user_id = u.id);SQL проверяет отсутствие связанной строки и сразу останавливается при первом совпадении.Ту же задачу можно решить через LEFT JOIN:id="f1q9vc"SELECT u.*FROM users uLEFT JOIN orders o ON o.user_id = u.idWHERE o.id IS NULL;LEFT JOIN оставляет все строки users, а WHERE o.id IS NULL отбирает только те, где совпадений не нашлось.Этот паттерн и называется антиджойн — верни строки, для которых связи не существует.Особенно полезно это в проверках целостности данных:id="k6n2yb"SELECT *FROM orders oWHERE NOT EXISTS ( SELECT 1 FROM users u WHERE u.id = o.user_id);Так можно быстро найти битые записи с отсутствующими foreign key.🔥 Антиджойны пригодятся в аналитике, ETL, аудитах данных и поиске проблемных связей между таблицами.➡️ SQL Ready | #практика

5 июн. 2026 г.2 320В Telegram

✍️ PostgreSQL Querying — практическое изучение SQL на PostgreSQL!Здесь подробно разбираются запросы, работа с данными, фильтрация, JOIN’ы, агрегации и другие конструкции, которые постоянно используются в разработке. Материал подаётся последовательно и на примерах, поэтому намного проще понять логику запросов и научиться писать их самостоятельно.Оставляю ссылочку: GitHub 📱➡️ SQL Ready | #репозиторий

5 июн. 2026 г.2 280В Telegram
SQL Ready | Базы Данных — пост в ТГ канале

NOT VALID constraints — как добавить CHECK и FOREIGN KEY на huge таблицу без долгой блокировки?Обычно добавление CHECK или FOREIGN KEY на большую таблицу рискованная операция, потому что PostgreSQL начинает сразу сканировать все старые данные.ALTER TABLE ordersADD CONSTRAINT orders_user_fkFOREIGN KEY (user_id)REFERENCES users(id);На production-таблицах в сотни строк это может превратиться в очень долгую блокировку DDL.Но в PostgreSQL есть фича — NOT VALID:ALTER TABLE ordersADD CONSTRAINT orders_price_checkCHECK (price > 0)NOT VALID;Без полного сканирования таблицы, сразу начинает проверять все новые записи. При этом старые строки пока не валидируются.Позже ограничение можно провалидировать отдельно:ALTER TABLE ordersVALIDATE CONSTRAINT orders_price_check;Самое интересное — VALIDATE CONSTRAINT не блокирует обычный concurrent DML как классический ALTER TABLE.То же самое работает и для FOREIGN KEY:ALTER TABLE ordersADD CONSTRAINT orders_user_fkFOREIGN KEY (user_id)REFERENCES users(id)NOT VALID;🔥 Это одна из самых полезных возможностей PostgreSQL для безопасных миграций, постепенного внедрения ограничений и наведения порядка в старых базах без длительного простоя.➡️ SQL Ready | #совет

4 июн. 2026 г.2 080В Telegram

❤️ PostgreSQL Tutorial — подробная документация и учебник по PostgreSQL!На сайте собрана большая база материалов по PostgreSQL: установка, настройка, SQL-запросы, работа с таблицами, индексами, функциями, транзакциями и администрированием базы данных. Материал подаётся последовательно. Отличный ресурс как для новичков, так и для разработчиков, которым нужен удобный справочник с примерами и практическими объяснениями.📌 Оставляю ссылочку: postgresql.leopard.in.ua➡️ SQL Ready | #ресурс

1 июн. 2026 г.2 670В Telegram
SQL Ready | Базы Данных — пост в ТГ канале

🖥 Разбираем методы управления пользователями и правами!В этой шпаргалке собраны ключевые команды для создания, изменения и удаления пользователей, назначения и отзыва прав, а также проверки текущих ролей и сессий. Они применяются при управлении безопасностью базы данных, настройке доступа и аналитической работе с ролями.➡️ SQL Ready | #шпора

29 мая 2026 г.2 670В Telegram