В производительных системах реальный
UX определяется не средним временем ответа, а редкими хвостовыми задержками, из-за которых важны именно p95 и p99.Сегодня в задаче:
• Посчитаем ключевые перцентильные метрики (p50/p95/p99) по каждому маршруту;
• Определим, какие запросы регулярно превышают собственный p99;
• Увидим, какие эндпоинты “убивают” отклик сервиса под нагрузкой;
Такой анализ помогает быстро находить узкие места
API и контролировать качество работы системы.Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
👍14❤11🔥8
ALL и ANY в SQL — учимся использовать для сравнения с подзапросами!
Эти операторы предназначены для сравнения результатов одного
Представим, что нам нужно найти все продукты, цена которых выше, чем цена любого продукта в категории
Теперь найдем всех клиентов, заказавших хотя бы один продукт с ценой выше 1000 рублей:
И найдем всех клиентов, которые заказывали продукты из определенной категории:
🔥 Но помните, что использование
➡️ SQL Ready | #практика
Эти операторы предназначены для сравнения результатов одного
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 возможно только с подзапросами и может быть неэффективным, если подзапрос возвращает большое количество строк.Please open Telegram to view this post
VIEW IN TELEGRAM
🤝17👍9🔥9❤2
Например, грамотное индексирование ускоряет выборки в разы, шардирование помогает масштабировать систему под высокий трафик, а репликация повышает отказоустойчивость и снижает нагрузку на основной узел.
На изображении — структурированное напоминание о ключевых метриках, типах нагрузок и практических стратегиях оптимизации.
Сохрани, чтобы не забыть!
Please open Telegram to view this post
VIEW IN TELEGRAM
👍13🔥8🤝7
Как точечно понять, почему конкретный индекс НЕ используется оптимизатором?
Если запрос игнорирует индекс, причина может быть не в индексе, а в том, что
Обновить статистику можно точечно, для одной конкретной колонки:
Теперь оптимизатор видит реальное распределение значений и может корректно выбрать
Хотите повысить точность — увеличьте глубину сбора статистики:
🔥 Позволяет понять почему план деградирует и как вернуть индекс в работу, без изменения кода и структуры данных.
➡️ SQL Ready | #совет
Если запрос игнорирует индекс, причина может быть не в индексе, а в том, что
PostgreSQL не знает, насколько селективное значение в колонке.Обновить статистику можно точечно, для одной конкретной колонки:
ANALYZE users (status);
Теперь оптимизатор видит реальное распределение значений и может корректно выбрать
Index Scan.Хотите повысить точность — увеличьте глубину сбора статистики:
ALTER TABLE users
ALTER COLUMN status SET STATISTICS 500;
Please open Telegram to view this post
VIEW IN TELEGRAM
❤13👍9🔥9
This media is not supported in your browser
VIEW IN TELEGRAM
Вам будут доступы более 320 интерактивных задач разной сложности: от простых SELECT-запросов до вложенных подзапросов и агрегаций. Поддерживаются MySQL, PostgreSQL, MS SQL и Firebird, есть мгновенная проверка решений и удобный интерфейс для отработки навыков на практике.
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥18❤9👍8
Работа со строками в PostgreSQL — извлекаем данные с помощью регулярных выражений!
В аналитике часто нужно разобрать строку: вытащить домен из email, код из SKU, номер из текста. PostgreSQL предоставляет функции
Создадим таблицу:
Извлечём домен из email:
Вытащим числовую часть из кода профиля, например "
Паттерн
Удалим всё кроме букв и цифр — удобно для нормализации входных данных:
🔥 Такие операции часто используются при подготовке данных, парсинге логов, анализе текстовых полей и нормализации входных атрибутов.
➡️ SQL Ready | #практика
В аналитике часто нужно разобрать строку: вытащить домен из 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;
Please open Telegram to view this post
VIEW IN TELEGRAM
❤15👍9🔥8
В этой статье:
• Разберёте реальные ошибки при развёртывании СУБД;
• Узнаете, как повысить производительность запросов через правильное партицирование и не только;
• Поймёте, как организовать конкурентный доступ и обновления данных без блокировок и простоев;
• Получите шесть конкретных лайфхаков, которые помогут избежать критических проблем.🔊 Продолжайте читать на Habr!
Please open Telegram to view this post
VIEW IN TELEGRAM
👍13❤10🔥6🤝2
SQL позволяет восстановить сессии даже без session_id, выделяя их по временным разрывам и последовательности событий.
Сегодня в задаче:
• Определим моменты, когда начинается новая сессия;
• Присвоим каждому событию уникальный session_id с помощью оконной суммы;
• Получим полноценные сессии так же, как это делают продуктовые аналитические платформы.
Пригодится для расчёта удержания, построения пользовательских путей, анализа фич и диагностики проблем поведения.
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
👍12🔥9🤝7
This media is not supported in your browser
VIEW IN TELEGRAM
Этот сайт предлагает другой путь: выбираешь язык, который уже знаешь, и переходишь на новый через сопоставление синтаксиса и парадигм. Более 80 модулей, 30+ проектов, всё бесплатно и без регистрации.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍15🔥7🤝6❤1
Keyset-пагинация: быстрый скролл без OFFSET!
Создаём таблицу (пример на PostgreSQL):
Подготавливаем входящие данные с помощью
Здесь мы храним «курсор» — id последней записи, которую клиент уже получил.
Получаем следующую страницу без
Запрос отдаёт следующие 20 записей с
На клиенте берём минимальный id из результата и используем его как новый
🔥 Подход работает в PostgreSQL, MySQL, SQL Server и др.: стабильно, эффективно и без проблем с дубликатами при конкурентных вставках.
➡️ SQL Ready | #практика
OFFSET…LIMIT прост, но плохо масштабируется: чем дальше страница, тем медленнее запрос и выше риск дубликатов при вставках.Keyset использует курсор (id/дату) и даёт стабильную скорость на больших объёмах.Создаём таблицу (пример на PostgreSQL):
CREATE TABLE posts (
id BIGSERIAL PRIMARY KEY,
title TEXT NOT NULL,
created_at TIMESTAMPTZ NOT NULL DEFAULT NOW()
);
Подготавливаем входящие данные с помощью
CTE:WITH cursor AS (
SELECT 1000::BIGINT AS last_seen_id
)
Здесь мы храним «курсор» — id последней записи, которую клиент уже получил.
Получаем следующую страницу без
OFFSET по keyset-подходу:SELECT p.id, p.title, p.created_at
FROM posts p
JOIN cursor c ON TRUE
WHERE p.id < c.last_seen_id
ORDER BY p.id DESC
LIMIT 20;
Запрос отдаёт следующие 20 записей с
id < last_seen_id.На клиенте берём минимальный id из результата и используем его как новый
last_seen_id для следующего запроса.Please open Telegram to view this post
VIEW IN TELEGRAM
❤15👍8🔥6🤝2
Как понять, какие индексы только тратят место?
Ненужные индексы замедляют вставки, обновления и
Посмотрим статистику использования:
Нужно увидеть “почти бесполезные” индексы? С сортировкой по минимальному использованию:
🔥 Инструмент позволяет быстро уменьшить нагрузку,
ускорить записи и освободить место.
➡️ SQL Ready | #совет
Ненужные индексы замедляют вставки, обновления и
VACUUM. PostgreSQL умеет показать, какие индексы ни разу не использовались.Посмотрим статистику использования:
SELECT relname, idx_scan, pg_size_pretty(pg_relation_size(indexrelid)) AS size
FROM pg_stat_user_indexes
WHERE idx_scan = 0;
idx_scan = 0 — индекс ни разу не участвовал в плане.size покажет, сколько места он занимает на диске.Нужно увидеть “почти бесполезные” индексы? С сортировкой по минимальному использованию:
SELECT relname, idx_scan, idx_tup_read
FROM pg_stat_user_indexes
ORDER BY idx_scan ASC
LIMIT 10;
ускорить записи и освободить место.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍14🔥8🤝7❤3