Когда фильтры задействуют несколько индексов,
Index Scan может работать неэффективно. Bitmap Scan объединяет результаты этих индексов и читает только нужные страницы.Сегодня в гайде:
• Как bitmap объединяет несколько индексов;
• Что означает BitmapAnd в плане выполнения;
• Почему эта техника ускоряет сложные фильтры на больших таблицах.
Прием позволяет эффективно обрабатывать сложные фильтры и стабильно работать с большими таблицами.
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
👍13❤10🔥9
Хотите найти дубликаты по нескольким полям и оставить только самые свежие или правильные записи?
Используйте оконную функцию
которые должны быть уникальны:
Первая строка в группе
Все остальные - реальные дубликаты, которые можно чистить.
Чтобы увидеть только те строки, которые должны быть удалены:
🔥 Подходит для очистки данных, поиска дубликатов, контроля миграций и проверки внешних интеграций.
➡️ SQL Ready | #совет
Используйте оконную функцию
ROW_NUMBER() по ключам,которые должны быть уникальны:
ROW_NUMBER() OVER (
PARTITION BY email, phone
ORDER BY updated_at DESC
)
Первая строка в группе
(dup_rank = 1) - оригинал.Все остальные - реальные дубликаты, которые можно чистить.
Чтобы увидеть только те строки, которые должны быть удалены:
SELECT *
FROM (
SELECT *, ROW_NUMBER() OVER (
PARTITION BY email, phone ORDER BY updated_at DESC
) AS dup_rank
FROM users
) t
WHERE dup_rank > 1;
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥18👍15❤8🤝1
В этой шпаргалке собраны ключевые функции и операторы MySQL для чтения, обновления, проверки и формирования JSON-структур. Материал охватывает извлечение значений, модификацию полей, работу с объектами и массивами, а также проверку вложенных данных. Подходит для хранения метаданных, гибких профилей и других полуструктурированных данных.Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥18👍12🤝6❤2
Возьмём последовательность обращений к ключам и с помощью SQL определим, какие из них “выжили” в памяти при ограниченном размере кэша.
Сегодня в задаче:
• Найдём последнее обращение к каждому ключу, определив его актуальность на момент завершения всех операций.
• Отсортируем элементы по “новизне” использования и применим ограничение capacity;
• Получим итоговое состояние LRU-кэша;
Такой подход позволяет анализировать поведение кэшей и логи обращений без процедурного кода.
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
👍14❤8🔥7🤝2
Как увидеть фрагментацию таблиц?
Часто производительность падает из-за накопления устаревших (dead) кортежей, которые остаются после
Посмотреть их реальный объём можно напрямую из системной статистики:
Чтобы быстро найти самые “раздутые” таблицы, отсортируем по dead-tup:
Хотите оценить степень фрагментации? Сравните dead/live в процентах:
🔥 Это позволяет быстро увидеть, где появляются накладные расходы на I/O и почему планы запроса деградируют.
➡️ SQL Ready | #совет
Часто производительность падает из-за накопления устаревших (dead) кортежей, которые остаются после
UPDATE/DELETE до следующего VACUUM.Посмотреть их реальный объём можно напрямую из системной статистики:
SELECT relname,
n_dead_tup,
n_live_tup
FROM pg_stat_all_tables
WHERE relname = 'orders';
n_dead_tup — количество устаревших кортежей, n_live_tup — актуальные строки.Чтобы быстро найти самые “раздутые” таблицы, отсортируем по dead-tup:
SELECT relname, n_dead_tup
FROM pg_stat_all_tables
ORDER BY n_dead_tup DESC
LIMIT 10;
Хотите оценить степень фрагментации? Сравните dead/live в процентах:
SELECT relname,
n_dead_tup,
n_live_tup,
round(100.0 * n_dead_tup / (n_live_tup + 1), 2) AS dead_ratio
FROM pg_stat_all_tables;
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥15👍9❤8
Селективность определяет, сколько строк проходит через фильтр, и именно по этому показателю оптимизатор выбирает план запроса.
Сегодня в гайде:
• Как селективность влияет на выбор плана;
• Почему один и тот же запрос может работать по-разному на разных данных;
• Как устаревшая статистика приводит к “не тем” решениям оптимизатора.
Эта тема, помогает понимать реальные причины поведения плана.
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
👍17❤7🔥7🤝1
QUALIFY: фильтрация после оконных функций!
Иногда нужно фильтровать строки после вычисления оконных функций. В большинстве диалектов SQL для этого нужен подзапрос, но в ряде СУБД (Snowflake, BigQuery, Teradata, Oracle 23c) есть конструкция
Отбираем строки только с первым местом внутри категории:
Фильтруем строки, где разница с предыдущим значением больше 50:
Оставляем топ-3 самых больших заказов каждого клиента:
🔥
➡️ SQL Ready | #практика
Иногда нужно фильтровать строки после вычисления оконных функций. В большинстве диалектов 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 помогает писать чище и короче, избавляя от лишних подзапросов. Особенно полезен в аналитических задачах с большим числом оконных функций.Please open Telegram to view this post
VIEW IN TELEGRAM
🔥13👍9❤7🤝1