👍12🔥7🤝7❤2👎2
VACUUM — чистим таблицу и ускоряем работу базы!
В большинстве СУБД удалённые или обновлённые строки не удаляются мгновенно, а остаются как «мертвые» записи. Со временем это замедляет запросы и увеличивает размер таблиц — нужна очистка.
Сначала удаляем устаревшие записи из таблицы:
Однако физически строки всё ещё занимают место.
Чтобы освободить пространство и обновить статистику, запускаем:
Для диагностики можно получить подробный отчёт о процессе очистки:
🔥 Регулярный
➡️ SQL Ready | #практика
В большинстве СУБД удалённые или обновлённые строки не удаляются мгновенно, а остаются как «мертвые» записи. Со временем это замедляет запросы и увеличивает размер таблиц — нужна очистка.
Сначала удаляем устаревшие записи из таблицы:
DELETE FROM sessions WHERE expired = true;
Однако физически строки всё ещё занимают место.
Чтобы освободить пространство и обновить статистику, запускаем:
VACUUM ANALYZE sessions;
Для диагностики можно получить подробный отчёт о процессе очистки:
VACUUM VERBOSE sessions;
🔥 Регулярный
VACUUM поддерживает производительность и точность планов запросов.Please open Telegram to view this post
VIEW IN TELEGRAM
🔥15❤9👍9
PostgreSQL работает через процессы и shared memory, а системой управляет Postmaster и фоновые процессы. MySQL использует слоистую архитектуру: подключение, обработка SQL и storage engine (например InnoDB).
На картинке — основные компоненты и различия архитектуры двух популярных СУБД.
Сохрани, чтобы не забыть!
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥16❤10👍8🤝2
Получение top-N строк с учётом равных значений!
Иногда нужно получить не просто N строк, а все записи, которые имеют такое же значение сортировки, как и последняя строка в выборке.
Это полезно для топ-продаж, логов и аналитики.
Обычный
Это удобно для построения top-N выборок, где несколько строк могут делить одно и то же место:
🔥 Такой приём позволяет строить top-выборки без дополнительных подзапросов и оконных функций.
➡️ SQL Ready | #совет
Иногда нужно получить не просто N строк, а все записи, которые имеют такое же значение сортировки, как и последняя строка в выборке.
Это полезно для топ-продаж, логов и аналитики.
FETCH FIRST 5 ROWS ONLY
Обычный
LIMIT / FETCH возвращает ровно N строк и может «обрезать» записи с таким же значением сортировки.WITH TIES возвращает все строки, у которых значение ORDER BY совпадает с последней строкой результата:FETCH FIRST 5 ROWS WITH TIES
Это удобно для построения top-N выборок, где несколько строк могут делить одно и то же место:
ORDER BY score DESC
FETCH FIRST 10 ROWS WITH TIES
WITH TIES не заменяет RANK() / DENSE_RANK(), если нужен полноценный рейтинг с номером места. Также проверьте синтаксис в вашей СУБД (например, в SQL Server используется TOP ... WITH TIES).Please open Telegram to view this post
VIEW IN TELEGRAM
🔥12👍8❤7🤝2
This media is not supported in your browser
VIEW IN TELEGRAM
Здесь разобраны реальные примеры запросов: выборки, фильтрация, JOIN-ы, подзапросы, агрегации и другие ключевые конструкции, которые чаще всего используются при работе с базами данных. Формат максимально простой: пример, объяснение, результат, поэтому можно быстро понять, как работает конкретный запрос и сразу применить его в своих задачах.
Оставляю ссылочку: GitHub📱
Please open Telegram to view this post
VIEW IN TELEGRAM
👍12🔥8🤝8
PostgreSQL: CONCAT_WS, если нужно нормально собрать строку из колонок с NULL!
Частая мелочь в SQL — собрать одну строку из нескольких полей. Например, имя пользователя из
Таблица условно такая:
Первое, что обычно пишут:
И тут важный момент: если хотя бы одно значение NULL, всё выражение тоже уйдёт в NULL.
То есть если
В таких случаях удобнее использовать
Если
Плюс не нужно отдельно думать про лишние пробелы — разделитель вставится только там, где есть значение.
Важно:
То же самое можно собрать и через
Но это уже выглядит тяжелее, особенно когда полей больше двух-трёх.
🔥 Так что для таких кейсов
➡️ SQL Ready | #практика
Частая мелочь в SQL — собрать одну строку из нескольких полей. Например, имя пользователя из
first_name, middle_initial, last_name.Таблица условно такая:
users(id, first_name, middle_initial, last_name)
Первое, что обычно пишут:
SELECT first_name || ' ' || middle_initial || ' ' || last_name
FROM users;
И тут важный момент: если хотя бы одно значение NULL, всё выражение тоже уйдёт в NULL.
То есть если
middle_initial = NULL, то результат будет не Emily Johnson, а просто NULL.В таких случаях удобнее использовать
CONCAT_WS:SELECT CONCAT_WS(' ', first_name, middle_initial, last_name)
FROM users;CONCAT_WS склеивает значения через разделитель и просто пропускает NULL.Если
middle_initial = 'A': Emily A Johnson. Если middle_initial = NULL: Emily Johnson.Плюс не нужно отдельно думать про лишние пробелы — разделитель вставится только там, где есть значение.
Важно:
CONCAT_WS пропускает именно NULL. Пустая строка не игнорируется.То же самое можно собрать и через
COALESCE, например так:SELECT
COALESCE(first_name || ' ', '') ||
COALESCE(middle_initial || ' ', '') ||
COALESCE(last_name, '')
FROM users;
Но это уже выглядит тяжелее, особенно когда полей больше двух-трёх.
CONCAT_WS обычно самый нормальный вариант: и короче, и читается лучше.Please open Telegram to view this post
VIEW IN TELEGRAM
❤16🔥10👍9
В этой статье:
• Объясняется, как на самом деле работают оконные функции в SQL и почему результаты иногда отличаются от ожидаемых;
• Разбираются ключевые типы оконных фреймов — ROWS, RANGE и GROUPS, а также их влияние на вычисления;
• Показано, как правильно задавать границы окна (UNBOUNDED PRECEDING, CURRENT ROW, FOLLOWING) для накопительных итогов, скользящих средних и аналитических запросов.🔊 Продолжайте читать на Habr!
Please open Telegram to view this post
VIEW IN TELEGRAM
👍12❤8🔥8
Основные функции обработки строк в Oracle SQL: извлечение подстрок, определение позиции подстроки, вычисление длины строки, преобразование регистра, удаление лишних символов по краям, замена фрагментов текста и дополнение строки до заданной длины.Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥14🤝8❤7👍1
🔥12👍10🤝9
DISTINCT — убираем дубликаты прямо в SQL!
Иногда таблица содержит повторы, а нам нужны только уникальные строки.
Выберем все уникальные города из таблицы клиентов:
Теперь получим только уникальные пары "страна + город":
А вот как посчитать количество разных городов:
В PostgreSQL можно выбирать первую уникальную строку по группе значений:
🔥
➡️ SQL Ready | #практика
Иногда таблица содержит повторы, а нам нужны только уникальные строки.
DISTINCT позволяет легко отфильтровать дубликаты на уровне запроса — без дополнительной логики.Выберем все уникальные города из таблицы клиентов:
SELECT DISTINCT city FROM customers;
Теперь получим только уникальные пары "страна + город":
SELECT DISTINCT country, city FROM customers;
А вот как посчитать количество разных городов:
SELECT COUNT(DISTINCT city) FROM customers;
В PostgreSQL можно выбирать первую уникальную строку по группе значений:
SELECT DISTINCT ON (user_id) *
FROM logins
ORDER BY user_id, login_time DESC;
🔥
DISTINCT полезен для отчётов, списков, фильтрации и аналитики. Но помните: он влияет на производительность — особенно при работе с большими таблицами.Please open Telegram to view this post
VIEW IN TELEGRAM
❤14👍9🤝8
Например, реляционные базы используют строгую структуру таблиц и отлично подходят для транзакций, а NoSQL — гибкие и масштабируемые, подходят для высоконагруженных приложений.
На картинке — 4 типа баз данных, их особенности, преимущества и где их лучше применять.
Сохрани, чтобы не забыть!
Please open Telegram to view this post
VIEW IN TELEGRAM
❤14👍10🔥8
Индекс с INCLUDE: уменьшаем чтение таблицы!
Даже если у вас есть индекс, PostgreSQL часто всё равно идёт в таблицу за остальными колонками — это лишний I/O, особенно на больших данных:
Теперь все нужные поля есть в индексе, и PostgreSQL может выполнить запрос через
В плане вы увидите
🔥 Один из практических бустов в read-heavy сценариях и частых API-запросах.
➡️ SQL Ready | #совет
Даже если у вас есть индекс, PostgreSQL часто всё равно идёт в таблицу за остальными колонками — это лишний I/O, особенно на больших данных:
CREATE INDEX idx_orders_user_created
ON orders (user_id, created_at DESC)
INCLUDE (total, status);
INCLUDE добавляет дополнительные колонки в индекс (payload), но они не участвуют в поиске и сортировке, часто это выгоднее, чем делать их частью ключа:SELECT user_id, created_at, total, status
FROM orders
WHERE user_id = 42
ORDER BY created_at DESC
LIMIT 1;
Теперь все нужные поля есть в индексе, и PostgreSQL может выполнить запрос через
Index Only Scan, уменьшая или исключая обращения к таблице (heap):EXPLAIN ANALYZE SELECT ...
В плане вы увидите
Index Only Scan (иногда с Heap Fetches) вместо Index Scan — это значит, что обращения к таблице сокращены или отсутствуют.Please open Telegram to view this post
VIEW IN TELEGRAM
🔥13👍9❤6🤝2