📕Интеграция Clickhouse и dbt
Вебинар для: Data-инженеров, архитекторов и аналитиков, администраторам баз данных и DevOps-инженеров, разработчиков высоконагруженных приложений
На открытом уроке 26 ноября в 20:00 мск мы рассмотрим все тонкости интеграции Clickhouse и dbt:
📗 На вебинаре разберемся как:
1. Разворачивать dbt-проект и настраивать минимальную конфигурацию под ClickHouse.
2. Выбирать и применять материализации под задачу.
📘 В результате на практике изучите и освоите работу с Jinja, написание небольших макросов, добавление тестов, генерирацию документации и её использование.
👉 Регистрация на урок и подробности о курсе ClickHouse для инженеров и архитекторов БД: https://vk.cc/cRGWAT
Все участники открытого урока получат скидку на курс "ClickHouse для инженеров и архитекторов БД"
Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576, www.otus.ru
Вебинар для: Data-инженеров, архитекторов и аналитиков, администраторам баз данных и DevOps-инженеров, разработчиков высоконагруженных приложений
На открытом уроке 26 ноября в 20:00 мск мы рассмотрим все тонкости интеграции Clickhouse и dbt:
📗 На вебинаре разберемся как:
1. Разворачивать dbt-проект и настраивать минимальную конфигурацию под ClickHouse.
2. Выбирать и применять материализации под задачу.
📘 В результате на практике изучите и освоите работу с Jinja, написание небольших макросов, добавление тестов, генерирацию документации и её использование.
👉 Регистрация на урок и подробности о курсе ClickHouse для инженеров и архитекторов БД: https://vk.cc/cRGWAT
Все участники открытого урока получат скидку на курс "ClickHouse для инженеров и архитекторов БД"
Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576, www.otus.ru
❤1
🚀 Сегодня покажу, как быстро диагностировать «тормоза» в PostgreSQL - без всяких внешних тулов и дополнительных логов. Только
Пользователи жалуются - "всё тормозит". Как понять, что именно? Открываем сессию в
📌 Что это нам даёт:
- Видим все активные (и зависшие) запросы.
- Сколько времени они уже выполняются (
- На чём конкретно «висят»: CPU, IO, Lock, Client и т.д. (
Пример:
→ Сразу ясно: кто-то держит блокировку на таблицу, и все остальные ждут.
🔥Чтобы найти виновника, можно запустить:
Этот запрос покажет, кто кого блокирует, и с каким запросом.
🙌 Это простая, но мощная техника диагностики. Помогала мне не раз в проде - особенно, когда времени мало, а багов много.
Ты пользуешься
📲 Мы в MAX
#db
👉 @database_info
pg_stat_activity и немного здравого смысла.Пользователи жалуются - "всё тормозит". Как понять, что именно? Открываем сессию в
psql от суперпользователя и запускаем:
SELECT pid, state, wait_event_type, wait_event, query, now() - query_start AS duration
FROM pg_stat_activity
WHERE state != 'idle'
ORDER BY duration DESC;
📌 Что это нам даёт:
- Видим все активные (и зависшие) запросы.
- Сколько времени они уже выполняются (
duration).- На чём конкретно «висят»: CPU, IO, Lock, Client и т.д. (
wait_event_type + `wait_event).Пример:
wait_event_type: Lock
wait_event: relation
→ Сразу ясно: кто-то держит блокировку на таблицу, и все остальные ждут.
🔥Чтобы найти виновника, можно запустить:
SELECT blocked_locks.pid AS blocked_pid,
blocking_locks.pid AS blocking_pid,
blocked_activity.query AS blocked_query,
blocking_activity.query AS blocking_query
FROM pg_locks blocked_locks
JOIN pg_locks blocking_locks ON blocked_locks.locktype = blocking_locks.locktype
AND blocked_locks.database IS NOT DISTINCT FROM blocking_locks.database
AND blocked_locks.relation IS NOT DISTINCT FROM blocking_locks.relation
AND blocked_locks.page IS NOT DISTINCT FROM blocking_locks.page
AND blocked_locks.tuple IS NOT DISTINCT FROM blocking_locks.tuple
AND blocked_locks.transactionid IS NOT DISTINCT FROM blocking_locks.transactionid
AND blocked_locks.classid IS NOT DISTINCT FROM blocking_locks.classid
AND blocked_locks.objid IS NOT DISTINCT FROM blocking_locks.objid
AND blocked_locks.objsubid IS NOT DISTINCT FROM blocking_locks.objsubid
AND blocked_locks.pid != blocking_locks.pid
JOIN pg_stat_activity blocked_activity ON blocked_activity.pid = blocked_locks.pid
JOIN pg_stat_activity blocking_activity ON blocking_activity.pid = blocking_locks.pid
WHERE NOT blocked_locks.granted;
Этот запрос покажет, кто кого блокирует, и с каким запросом.
🙌 Это простая, но мощная техника диагностики. Помогала мне не раз в проде - особенно, когда времени мало, а багов много.
Ты пользуешься
pg_stat_activity в проде? Или сразу лезешь в лог? Расскажи в комментах!#db
👉 @database_info
Please open Telegram to view this post
VIEW IN TELEGRAM
👍10🔥2❤1🤡1
📕Временные ряды и наблюдаемость: как устроены Time-Series базы данных
👤Вебинар для разработчиков, администраторов, специалистов по базам данных, Data engineers, Backend и FullStack-разработчиков
На открытом уроке 1 декабря в 20:00 мск мы разберем, чем хранилища временных рядов отличаются от реляционных и колоночных БД, и на практике сравним работу VictoriaMetrics и InfluxDB:
📗 На вебинаре:
1. Архитектура time-series баз: retention, downsampling, continuous queries.
2. Сравнение VictoriaMetrics, InfluxDB и ClickHouse для метрик.
📘 В результате на практике изучите и освоите умение выбирать подходящую TSDB (VictoriaMetrics, InfluxDB, ClickHouse) под задачи проекта, и получите четкое понимание архитектурных особенностей Time-Series баз данных.
👉 Регистрация на урок и подробности о курсе NoSQL: https://vk.cc/cRQl3F
Все участники открытого урока получат скидку на курс "NoSQL"
Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576
👤Вебинар для разработчиков, администраторов, специалистов по базам данных, Data engineers, Backend и FullStack-разработчиков
На открытом уроке 1 декабря в 20:00 мск мы разберем, чем хранилища временных рядов отличаются от реляционных и колоночных БД, и на практике сравним работу VictoriaMetrics и InfluxDB:
📗 На вебинаре:
1. Архитектура time-series баз: retention, downsampling, continuous queries.
2. Сравнение VictoriaMetrics, InfluxDB и ClickHouse для метрик.
📘 В результате на практике изучите и освоите умение выбирать подходящую TSDB (VictoriaMetrics, InfluxDB, ClickHouse) под задачи проекта, и получите четкое понимание архитектурных особенностей Time-Series баз данных.
👉 Регистрация на урок и подробности о курсе NoSQL: https://vk.cc/cRQl3F
Все участники открытого урока получат скидку на курс "NoSQL"
Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576
👍2
Как быстро найти “тяжёлые” запросы в PostgreSQL
Сегодня покажу простой способ найти самые ресурсоёмкие запросы, которые прямо сейчас выполняются в PostgreSQL. Это помогает, когда база начинает “тормозить”, а понять почему - сложно.
Используем pg_stat_activity и pg_stat_statements. Но сначала убедись, что pg_stat_statements включён:
Теперь сам запрос на поиск “тяжёлых” запросов:
А если интересует то, что прямо сейчас выполняется — тогда так:
Я часто сохраняю эти запросы в отдельный .sql-файл, чтобы запускать сразу при проблемах с производительностью. Полезно добавить в .psqlrc алиас или даже обернуть в скрипт.
Как вы ищете “тяжёлые” запросы в проде? Поделитесь в комментариях.
📲 Мы в MAX
#db
👉 @database_info
Сегодня покажу простой способ найти самые ресурсоёмкие запросы, которые прямо сейчас выполняются в PostgreSQL. Это помогает, когда база начинает “тормозить”, а понять почему - сложно.
Используем pg_stat_activity и pg_stat_statements. Но сначала убедись, что pg_stat_statements включён:
-- Проверка:
SELECT * FROM pg_extension WHERE extname = 'pg_stat_statements';
-- Включение (если не установлен):
CREATE EXTENSION pg_stat_statements;Теперь сам запрос на поиск “тяжёлых” запросов:
SELECT
query,
calls,
total_exec_time,
mean_exec_time,
rows
FROM
pg_stat_statements
ORDER BY
total_exec_time DESC
LIMIT 5;А если интересует то, что прямо сейчас выполняется — тогда так:
SELECT
pid,
now() - query_start AS duration,
state,
query
FROM
pg_stat_activity
WHERE
state != 'idle'
ORDER BY
duration DESC;Я часто сохраняю эти запросы в отдельный .sql-файл, чтобы запускать сразу при проблемах с производительностью. Полезно добавить в .psqlrc алиас или даже обернуть в скрипт.
Как вы ищете “тяжёлые” запросы в проде? Поделитесь в комментариях.
#db
👉 @database_info
Please open Telegram to view this post
VIEW IN TELEGRAM
👍7❤1
This media is not supported in your browser
VIEW IN TELEGRAM
Будьте осторожны при подсчете строк из outer join
Это происходит потому, что
Убедитесь, что
📲 Мы в MAX
#db
👉 @database_info
COUNT (*) => строки в группе; всегда хотя бы однаCOUNT ( inner_tab_col ) => строки из внутренней таблицы; ноль, если нет совпадений.Это происходит потому, что
COUNT ( col ) добавляет только ненулевые значения.Убедитесь, что
inner_tab_col является обязательным!#db
👉 @database_info
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2
🧵 Сегодня я покажу вам простой, но мощный способ отладки сложных SQL-запросов
Когда у вас в проекте появляется монструозный запрос с десятками джойнов, подзапросов и оконных функций — ловить ошибки становится больно. Но есть подход, который реально спасает: инкрементальная отладка.
💡 Суть: разбиваем запрос на небольшие части и поочередно проверяем каждую
Вот как это делаю я:
1. Начинаю с ядра - самого внутреннего подзапроса или CTE. Проверяю, что он возвращает ожидаемые данные.
2. Добавляю следующий уровень логики - джойны, условия, группировки. Каждый раз выполняю и проверяю результат.
3. Для удобства использую
4. Сложные выражения и агрегаты выношу в отдельные CTE - это помогает быстрее изолировать проблему.
5. Если запрос очень тяжёлый - сохраняю промежуточные результаты в временные таблицы.
🔥 PostgreSQL позволяет использовать
📲 Мы в MAX
#db
👉 @database_info
Когда у вас в проекте появляется монструозный запрос с десятками джойнов, подзапросов и оконных функций — ловить ошибки становится больно. Но есть подход, который реально спасает: инкрементальная отладка.
💡 Суть: разбиваем запрос на небольшие части и поочередно проверяем каждую
Вот как это делаю я:
1. Начинаю с ядра - самого внутреннего подзапроса или CTE. Проверяю, что он возвращает ожидаемые данные.
2. Добавляю следующий уровень логики - джойны, условия, группировки. Каждый раз выполняю и проверяю результат.
3. Для удобства использую
WITH (CTE) - это даёт имена промежуточным результатам и делает запрос читабельным.4. Сложные выражения и агрегаты выношу в отдельные CTE - это помогает быстрее изолировать проблему.
5. Если запрос очень тяжёлый - сохраняю промежуточные результаты в временные таблицы.
🔥 PostgreSQL позволяет использовать
EXPLAIN (ANALYZE, BUFFERS) для профилирования на каждом этапе. Очень помогает найти, где тормозит.#db
👉 @database_info
Please open Telegram to view this post
VIEW IN TELEGRAM
👍7🔥5
📕Векторное ускорение: Как ClickHouse использует современные процессоры
Вебинар для: Data-инженеров, архитекторов и аналитиков, администраторам баз данных и DevOps-инженеров, разработчиков высоконагруженных приложений
На открытом уроке 8 декабря в 20:00 мск мы разберемся, как ClickHouse достигает рекордной производительности, благодаря глубокой оптимизации под современные процессоры:
📗 На вебинаре разберемся как:
1. Настраивать ClickHouse для лучшего использования процессорных возможностей.
2. Выбирать оптимальное оборудование для рабочих нагрузок ClickHouse.
📘 В результате на практике научитесь писать более эффективные запросы с учетом векторной обработки, а также узнаете, как SIMD-инструкции ускоряют вычисления в сотни раз, и почему кеш-память CPU критически важна для аналитических запросов.
👉 Регистрация на урок и подробности о курсе ClickHouse для инженеров и архитекторов БД: https://vk.cc/cRZAo7
Все участники открытого урока получат скидку на курс "ClickHouse для инженеров и архитекторов БД"
Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576
Вебинар для: Data-инженеров, архитекторов и аналитиков, администраторам баз данных и DevOps-инженеров, разработчиков высоконагруженных приложений
На открытом уроке 8 декабря в 20:00 мск мы разберемся, как ClickHouse достигает рекордной производительности, благодаря глубокой оптимизации под современные процессоры:
📗 На вебинаре разберемся как:
1. Настраивать ClickHouse для лучшего использования процессорных возможностей.
2. Выбирать оптимальное оборудование для рабочих нагрузок ClickHouse.
📘 В результате на практике научитесь писать более эффективные запросы с учетом векторной обработки, а также узнаете, как SIMD-инструкции ускоряют вычисления в сотни раз, и почему кеш-память CPU критически важна для аналитических запросов.
👉 Регистрация на урок и подробности о курсе ClickHouse для инженеров и архитекторов БД: https://vk.cc/cRZAo7
Все участники открытого урока получат скидку на курс "ClickHouse для инженеров и архитекторов БД"
Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576
⚠️ Антипаттерн: использовать NULL без оглядки
На первый взгляд
🔸
🔸 Агрегации ведут себя странно.
🔸 Индексы и
🔸
💡 Как избежать проблем:
1. Всегда осознанно работай с
2. По возможности избегай
3. Добавляй проверки в коде:
4. Понимай, как твоя СУБД работает с
🎯 Вывод:
Сохрани, чтобы не отловить баг на проде 🐛
📲 Мы в MAX
#db
👉 @database_info
На первый взгляд
NULL — это просто “нет значения”. Но в реальности — это тихий саботаж:🔸
NULL != NULL. Да-да, сравнение NULL = NULL даст false или unknown. Это ломает привычную логику и может убить фильтры.🔸 Агрегации ведут себя странно.
COUNT(column) не считает NULL'ы. AVG, SUM — тоже их игнорируют. Итог: неверная статистика.🔸 Индексы и
WHERE column IS NULL. Не все СУБД эффективно используют индексы при таких запросах. Можно словить тормоза.🔸
NOT IN + NULL = 💥. Запрос WHERE id NOT IN (subquery) может вернуть пустой результат, если в подзапросе есть хотя бы один NULL.💡 Как избежать проблем:
1. Всегда осознанно работай с
NULL — используй IS NULL и IS NOT NULL, не = и !=.2. По возможности избегай
NULL в колонках, где это не нужно. Лучше использовать значения по умолчанию.3. Добавляй проверки в коде:
COALESCE, IFNULL, NVL и аналоги.4. Понимай, как твоя СУБД работает с
NULL в индексах и фильтрах.🎯 Вывод:
NULL — не пустота, а “неизвестность”. Обращайся с ним осторожно, иначе баги будут неявными и неприятными.Сохрани, чтобы не отловить баг на проде 🐛
#db
👉 @database_info
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥11👍3
Транзакции в SQLite: просто, но со своими нюансами
SQLite - это встраиваемая база данных, и она немного отличается от привычных серверных СУБД (PostgreSQL, MySQL) в части работы с транзакциями. Но транзакции там есть, и работают по принципу ACID - атомарность, согласованность, изолированность и долговечность.
Разберёмся по полочкам:
🔹 Как начинается и заканчивается транзакция?
Или, в случае ошибки:
Можно использовать синонимы:
-
-
-
Они отличаются уровнем блокировок.
🔹 Типы транзакций
1. DEFERRED (по умолчанию)
🔒 Блокировки ставятся только при первом доступе к таблице (на чтение/запись).
2. IMMEDIATE
🔒 Сразу ставит блокировку на запись (write-lock). Полезно, если точно знаешь, что будешь писать — исключишь гонки.
3. EXCLUSIVE
🔒 Блокирует БД полностью. Даже другие чтения не пройдут.
🔹 Особенности SQLite
- Одна запись за раз: SQLite поддерживает одновременные чтения, но только одну запись одновременно. Остальные получат "database is locked".
- Авто-коммиты: если явно не начать транзакцию - SQLite будет делать коммит после каждого запроса.
- Журналирование: SQLite использует WAL (write-ahead log) или rollback journal - в зависимости от настроек. WAL - более производителен для параллельного чтения.
💡 Советы
- При пакетной вставке всегда оборачивай в транзакцию:
→ Это в разы быстрее, чем отдельные
- Если получаешь ошибку
- Не оставил ли ты открытые транзакции
- Не работают ли несколько процессов с БД одновременно без координации
Сохрани, чтобы не потерять!
📲 Мы в MAX
#db
👉 @database_info
SQLite - это встраиваемая база данных, и она немного отличается от привычных серверных СУБД (PostgreSQL, MySQL) в части работы с транзакциями. Но транзакции там есть, и работают по принципу ACID - атомарность, согласованность, изолированность и долговечность.
Разберёмся по полочкам:
🔹 Как начинается и заканчивается транзакция?
BEGIN TRANSACTION;
-- какие-то запросы
COMMIT;
Или, в случае ошибки:
ROLLBACK;
Можно использовать синонимы:
-
BEGIN = BEGIN DEFERRED-
BEGIN IMMEDIATE-
BEGIN EXCLUSIVEОни отличаются уровнем блокировок.
🔹 Типы транзакций
1. DEFERRED (по умолчанию)
🔒 Блокировки ставятся только при первом доступе к таблице (на чтение/запись).
2. IMMEDIATE
🔒 Сразу ставит блокировку на запись (write-lock). Полезно, если точно знаешь, что будешь писать — исключишь гонки.
3. EXCLUSIVE
🔒 Блокирует БД полностью. Даже другие чтения не пройдут.
🔹 Особенности SQLite
- Одна запись за раз: SQLite поддерживает одновременные чтения, но только одну запись одновременно. Остальные получат "database is locked".
- Авто-коммиты: если явно не начать транзакцию - SQLite будет делать коммит после каждого запроса.
- Журналирование: SQLite использует WAL (write-ahead log) или rollback journal - в зависимости от настроек. WAL - более производителен для параллельного чтения.
💡 Советы
- При пакетной вставке всегда оборачивай в транзакцию:
BEGIN;
INSERT INTO users VALUES (...);
INSERT INTO users VALUES (...);
...
COMMIT;
→ Это в разы быстрее, чем отдельные
INSERT с автокоммитом.- Если получаешь ошибку
database is locked, проверь:- Не оставил ли ты открытые транзакции
- Не работают ли несколько процессов с БД одновременно без координации
Сохрани, чтобы не потерять!
#db
👉 @database_info
Please open Telegram to view this post
VIEW IN TELEGRAM
👍3❤1
Мероприятие: PG BootCamp Russia — официальное российское комьюнити-мероприятие PostgreSQL
Когда: весна 2026 г. (дата уточняется)
Где: г. Москва
Больше о мероприятиях PG BootCamp
В отличие от коммерческих конференций, предметом докладов выступает «ванильная» версия этой СУБД. Темы выступлений, связанные с коммерческими продуктами, не принимаются. Доклады (их обычно до 16 в два трека) делятся по темам разработки и эксплуатации. Формат предполагает камерную атмосферу, максимальную практическую пользу и содержательное профессиональное общение.
Открыт прием заявок на выступления:
🔹Исследование внутренней архитектуры PostgreSQL
🔹 Оптимизация производительности в высоконагруженных системах
🔹Анализ сложных задач и методов их решения
🔹 Инструменты и методологии для DBA
🔹 R&D-исследования, связанные с Postgres
Если у вас есть материалы, которым вы хотите поделиться с сообществом, — пожалуйста, присылайте тезисы. Это возможность не только представить свою работу, но и получить содержательную обратную связь от ведущих специалистов.
🎙Подать заявку на выступление
Please open Telegram to view this post
VIEW IN TELEGRAM
👍3
🚨 SELECT * - скрытый враг в проде
На dev-сервере всё шустро. В проде — беда: запросы висят, база потеет. И вроде бы всё ок... пока не заглянешь в SQL:
На первый взгляд — удобно. Но:
🔻 Проблемы “SELECT *”:
– Тянет все колонки, даже ненужные. А их может быть 30+.
– Увеличивает нагрузку на сеть и память приложения.
– Ломает кэш — ведь даже малейшие изменения в колонках меняют структуру результата.
– Убивает индекс-only scan: Postgres не может использовать покрывающий индекс, если явно не указаны поля.
✅ Как надо:
🎯 Выбирай только нужные поля:
💡 Хочешь “быстро протестить” в dev-е? Ок. Но не пускай такое в прод. Автоматизируй линтинг SQL, если надо.
Вывод:
Сохрани, чтобы не словить боль в проде.
А у тебя где последний раз встречалось
📲Мы в MAX
#db
👉 @database_info
На dev-сервере всё шустро. В проде — беда: запросы висят, база потеет. И вроде бы всё ок... пока не заглянешь в SQL:
SELECT * FROM users WHERE status = 'active';
На первый взгляд — удобно. Но:
🔻 Проблемы “SELECT *”:
– Тянет все колонки, даже ненужные. А их может быть 30+.
– Увеличивает нагрузку на сеть и память приложения.
– Ломает кэш — ведь даже малейшие изменения в колонках меняют структуру результата.
– Убивает индекс-only scan: Postgres не может использовать покрывающий индекс, если явно не указаны поля.
✅ Как надо:
🎯 Выбирай только нужные поля:
SELECT id, name, email FROM users WHERE status = 'active';
💡 Хочешь “быстро протестить” в dev-е? Ок. Но не пускай такое в прод. Автоматизируй линтинг SQL, если надо.
Вывод:
SELECT * — это не “удобно”, это дорого. И ты за него уже платишь.Сохрани, чтобы не словить боль в проде.
А у тебя где последний раз встречалось
SELECT *?📲Мы в MAX
#db
👉 @database_info
👍8
Антипаттерн: NULL в WHERE — и ты в ловушке
Когда в таблице есть
Ты ожидаешь, что выберутся все, кто не 30.
Но если
Почему? Потому что
А SQL возвращает строки только там, где
Как избежать?
1. Будь явно осторожен с NULL:
2. Логика на уровне схемы:
– Если поле нужно всегда — делай
– Если допускаешь
3. Не верь глазам своим:
Даже
Вывод:
Это "мы не знаем". И SQL ведёт себя с ним очень осторожно.
Сохрани, чтобы не словить грабли.
📲Мы в MAX
#db
👉 @database_info
Когда в таблице есть
NULL, а в WHERE ты пишешь что-то вроде:
SELECT * FROM users WHERE age != 30;
Ты ожидаешь, что выберутся все, кто не 30.
Но если
age IS NULL — такие строки пропадут из выборки!Почему? Потому что
NULL != 30 не TRUE, это UNKNOWN. А SQL возвращает строки только там, где
WHERE → TRUE.Как избежать?
1. Будь явно осторожен с NULL:
SELECT * FROM users
WHERE age != 30 OR age IS NULL;
2. Логика на уровне схемы:
– Если поле нужно всегда — делай
NOT NULL. – Если допускаешь
NULL, продумывай поведение выборок.3. Не верь глазам своим:
Даже
count(*) и count(column) ведут себя по-разному из-за NULL.Вывод:
NULL — это не ноль, не пустая строка и не "ничего". Это "мы не знаем". И SQL ведёт себя с ним очень осторожно.
Сохрани, чтобы не словить грабли.
📲Мы в MAX
#db
👉 @database_info
👍5❤1👎1
🚨 Как понять, почему запрос тормозит?
Сегодня покажу простой, но действенный подход к диагностике медленных SQL-запросов. Когда к тебе приходит прод с жалобой "что-то всё виснет", важно не паниковать, а системно подойти к анализу.
Вот что я делаю первым делом:
1. Включаю
Это ваш лучший друг. Не
2. Смотрю на узлы с наибольшим временем
Часто виновник — Seq Scan по большой таблице или Nested Loop с миллионами итераций.
3. Ищу несработавшие индексы
Был ли
4. Проверяю фильтрацию и сортировку
ORDER BY может убить всё. Особенно если не по индексу.
5. Думаю про статистику
🛠 Если ты часто отлаживаешь SQL — советую поставить pgMustard или использовать EXPLAIN DEPOT. Они визуализируют планы и сразу показывают узкие места.
📲 Мы в MAX
#db
👉 @database_info
Сегодня покажу простой, но действенный подход к диагностике медленных SQL-запросов. Когда к тебе приходит прод с жалобой "что-то всё виснет", важно не паниковать, а системно подойти к анализу.
Вот что я делаю первым делом:
1. Включаю
EXPLAIN (ANALYZE)Это ваш лучший друг. Не
EXPLAIN, а именно ANALYZE, чтобы получить реальные значения времени, а не план на бумаге.2. Смотрю на узлы с наибольшим временем
Часто виновник — Seq Scan по большой таблице или Nested Loop с миллионами итераций.
3. Ищу несработавшие индексы
Был ли
Index Scan или Index Only Scan? Если нет — стоит проверить, почему не сработал индекс. Может, фильтр не селективный?4. Проверяю фильтрацию и сортировку
ORDER BY может убить всё. Особенно если не по индексу.
5. Думаю про статистику
ANALYZE делали недавно? PostgreSQL может строить плохой план, если у него устаревшие данные. 🛠 Если ты часто отлаживаешь SQL — советую поставить pgMustard или использовать EXPLAIN DEPOT. Они визуализируют планы и сразу показывают узкие места.
#db
👉 @database_info
Please open Telegram to view this post
VIEW IN TELEGRAM
👍4