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
🖥 Selectivity — почему индекс может не сработать?

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

Сегодня в гайде:
Как селективность влияет на выбор плана;

Почему один и тот же запрос может работать по-разному на разных данных;

Как устаревшая статистика приводит к “не тем” решениям оптимизатора.


Эта тема, помогает понимать реальные причины поведения плана.

➡️ SQL Ready | #гайд
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
👍177🔥7🤝1
QUALIFY: фильтрация после оконных функций!

Иногда нужно фильтровать строки после вычисления оконных функций. В большинстве диалектов SQL для этого нужен подзапрос, но в ряде СУБД (Snowflake, BigQuery, Teradata, Oracle 23c) есть конструкция QUALIFY, позволяющая делать это напрямую.

Отбираем строки только с первым местом внутри категории:
SELECT id, category, score,
RANK() OVER (
PARTITION BY category
ORDER BY score DESC
) AS rnk
FROM results
QUALIFY rnk = 1;


Фильтруем строки, где разница с предыдущим значением больше 50:
SELECT id, value,
value - LAG(value) OVER (
ORDER BY id
) AS diff_prev
FROM metrics
QUALIFY diff_prev > 50;


Оставляем топ-3 самых больших заказов каждого клиента:
SELECT customer_id, order_id, amount,
ROW_NUMBER() OVER (
PARTITION BY customer_id
ORDER BY amount DESC
) AS rn
FROM orders
QUALIFY rn <= 3;


🔥 QUALIFY помогает писать чище и короче, избавляя от лишних подзапросов. Особенно полезен в аналитических задачах с большим числом оконных функций.

➡️ SQL Ready | #практика
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥13👍97🤝1
🖥 Методы для работы с датой и временем в PostgreSQL!

Эта шпаргалка охватывает наиболее используемые функции PostgreSQL для получения текущего времени, извлечения компонентов дат, расчета интервалов, округления временных меток и преобразования Unix-времени. Подходит для разработки систем, где критична точная и предсказуемая работа с временными значениями.

➡️ SQL Ready | #шпора
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
14🔥8👍7🤝2
This media is not supported in your browser
VIEW IN TELEGRAM
☕️ CodeAbbey — тренажёр алгоритмического мышления!

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

📌 Оставляю ссылочку: codeabbey.com

➡️ SQL Ready | #ресурс
Please open Telegram to view this post
VIEW IN TELEGRAM
18👍13🔥9
RETURNING: получение данных прямо из DML!

Во многих СУБД (например, PostgreSQL, Oracle и др.) оператор RETURNING позволяет вернуть значения вставленных, обновлённых или удалённых строк без дополнительного SELECT.

Вставляем строку и сразу получаем созданный ID:
INSERT INTO users (name, email)
VALUES ('Anna Ivanova', 'anna@example.com')
RETURNING id;


Обновляем запись и возвращаем изменённое значение:
UPDATE accounts
SET balance = balance + 500
WHERE id = 10
RETURNING balance AS new_balance;


Удаляем строку и получаем данные до удаления:
DELETE FROM orders
WHERE id = 42
RETURNING order_date, amount;


Возвращаем множество строк:
UPDATE products
SET price = price * 1.10
WHERE category = 'Books'
RETURNING id, price;


🔥 RETURNING упрощает логику: нет необходимости выполнять дополнительный запрос, чтобы получить новые данные — они доступны сразу в рамках одного DML.

➡️ SQL Ready | #практика
Please open Telegram to view this post
VIEW IN TELEGRAM
👍1610🔥7
🖥 Какие API-маршруты действительно тормозят систему?

В производительных системах реальный UX определяется не средним временем ответа, а редкими хвостовыми задержками, из-за которых важны именно p95 и p99.

Сегодня в задаче:
Посчитаем ключевые перцентильные метрики (p50/p95/p99) по каждому маршруту;

Определим, какие запросы регулярно превышают собственный p99;

Увидим, какие эндпоинты “убивают” отклик сервиса под нагрузкой;


Такой анализ помогает быстро находить узкие места API и контролировать качество работы системы.

➡️ SQL Ready | #задача
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
👍1411🔥8
ALL и ANY в SQL — учимся использовать для сравнения с подзапросами!

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

Представим, что нам нужно найти все продукты, цена которых выше, чем цена любого продукта в категории Discount:
SELECT product, price 
FROM products
WHERE price > ALL (SELECT price FROM products WHERE category = 'Discount');


Теперь найдем всех клиентов, заказавших хотя бы один продукт с ценой выше 1000 рублей:
SELECT DISTINCT customer_id 
FROM orders
WHERE product_id = ANY (SELECT product_id FROM products WHERE price > 1000);


И найдем всех клиентов, которые заказывали продукты из определенной категории:
SELECT DISTINCT customer_id
FROM orders
WHERE product_id = ANY (SELECT product_id FROM products WHERE category = 'Electronics');


🔥 Но помните, что использование ALL и ANY возможно только с подзапросами и может быть неэффективным, если подзапрос возвращает большое количество строк.

➡️ SQL Ready | #практика
Please open Telegram to view this post
VIEW IN TELEGRAM
🤝17👍9🔥92
📂 Напоминалка по оптимизации производительности БД!

Например, грамотное индексирование ускоряет выборки в разы, шардирование помогает масштабировать систему под высокий трафик, а репликация повышает отказоустойчивость и снижает нагрузку на основной узел.

На изображении — структурированное напоминание о ключевых метриках, типах нагрузок и практических стратегиях оптимизации.

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

➡️ SQL Ready | #ресурс
Please open Telegram to view this post
VIEW IN TELEGRAM
👍13🔥8🤝7
Как точечно понять, почему конкретный индекс НЕ используется оптимизатором?

Если запрос игнорирует индекс, причина может быть не в индексе, а в том, что PostgreSQL не знает, насколько селективное значение в колонке.

Обновить статистику можно точечно, для одной конкретной колонки:
ANALYZE users (status);


Теперь оптимизатор видит реальное распределение значений и может корректно выбрать Index Scan.

Хотите повысить точность — увеличьте глубину сбора статистики:
ALTER TABLE users
ALTER COLUMN status SET STATISTICS 500;


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

➡️ SQL Ready | #совет
Please open Telegram to view this post
VIEW IN TELEGRAM
13👍9🔥9
This media is not supported in your browser
VIEW IN TELEGRAM
😎 Sqltest - бесплатный онлайн-тренажёр для практики запросов прямо в браузере!

Вам будут доступы более 320 интерактивных задач разной сложности: от простых SELECT-запросов до вложенных подзапросов и агрегаций. Поддерживаются MySQL, PostgreSQL, MS SQL и Firebird, есть мгновенная проверка решений и удобный интерфейс для отработки навыков на практике.

📌 Оставляю ссылочку: sqltest.online

➡️ SQL Ready | #ресурс
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥189👍8
Работа со строками в PostgreSQL — извлекаем данные с помощью регулярных выражений!

В аналитике часто нужно разобрать строку: вытащить домен из email, код из SKU, номер из текста. PostgreSQL предоставляет функции regexp_match и regexp_replace, позволяющие делать это напрямую в SQL.

Создадим таблицу:
CREATE TABLE users (
id INT,
email TEXT,
profile_code TEXT
);


Извлечём домен из email:
SELECT 
id,
email,
(regexp_match(email, '@(.+)$'))[1] AS domain
FROM users;


regexp_match возвращает один массив, и [1] достаёт первую группу. Паттерн @(.+)$ берёт всё, что стоит после символа @.

Вытащим числовую часть из кода профиля, например "USR-2391-A":
SELECT 
id,
profile_code,
(regexp_match(profile_code, '([0-9]+)'))[1] AS numeric_part
FROM users;


Паттерн ([0-9]+) извлекает последовательность цифр.

Удалим всё кроме букв и цифр — удобно для нормализации входных данных:
SELECT 
id,
regexp_replace(profile_code, '[^A-Za-z0-9]', '', 'g') AS cleaned
FROM users;


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

➡️ SQL Ready | #практика
Please open Telegram to view this post
VIEW IN TELEGRAM
15👍9🔥8
😎 На Хабре вышла полезная статья: «6 лайфхаков при внедрении СУБД: учимся на чужих граблях»!

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


🔊 Продолжайте читать на Habr!


➡️ SQL Ready | #статья
Please open Telegram to view this post
VIEW IN TELEGRAM
👍1310🔥6🤝2