Базы данных (Data Base). По всем вопросам @evgenycarter
Как быстро найти “тяжёлые” запросы в PostgreSQL
Сегодня покажу простой способ найти самые ресурсоёмкие запросы, которые прямо сейчас выполняются в 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
🚀 Сегодня покажу, как быстро диагностировать «тормоза» в PostgreSQL — без всяких внешних тулов и дополнительных логов. Только 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
).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
в проде? Или сразу лезешь в лог? Расскажи в комментах!🧩 Как сделать backup PostgreSQL с минимальной нагрузкой на прод?
Сегодня покажу один из самых эффективных способов бэкапа PostgreSQL — с помощью pg_basebackup
+ реплики.
Сценарий: у нас есть продовый PostgreSQL и настроенная горячая реплика (streaming replication). Зачем использовать реплику для бэкапа?
Причины:
- 💡 На проде бэкап может замедлить отклик приложения.
- 🔁 Реплика — отличный способ разгрузить основной сервер.
- ⏱ Бэкап с pg_basebackup
возможен только на стопнутой БД или через репликацию.
Как сделать:
pg_basebackup -h replica.host -U repl_user -D /backup/pg -F tar -z -P
-h
— адрес реплики-U
— пользователь с правами репликации-D
— куда класть бэкап-F tar -z
— формат архива и сжатие-P
— прогресс в консолиrepl_user
должен быть прописан в pg_hba.conf
и иметь роль REPLICATION
.Хотите свести к минимуму риск потери информации?
Тогда ждём вас на вебинаре «Как обеспечить отказоустойчивость хранилищ данных»
В результате вы сможете:
- Разобраться в стратегии репликации, резервного копирования и автоматического фейловера
- Изучить архитектурные решения и инструменты для проектирования систем с высокой доступностью
- Эффективно сохранять данные при сбоях
- Улучшить пользовательский опыт
Будет интересно сисадминам, разработчикам, архитекторам ПО, IT-менеджерам, администраторам БД.
Спикер: Дмитрий Золотов, Kotlin-разработчик в «Яндексе».
Бонус! Всем участникам – скидка 5% на любой курс и гайд «Разбор ошибок: 5 распространённых проблем при проектировании отказоустойчивых хранилищ»
3 апреля, в 19:00 МСК, Бесплатно
Записаться на событие - https://otus.pw/8vSS/?erid=2W5zFGdDo1A
Реклама. ООО "ОТУС ОНЛАЙН-ОБРАЗОВАНИЕ". ИНН 9705100963.
Подборка Telegram каналов для программистов
/channel/bash_srv Bash Советы
/channel/win_sysadmin Системный Администратор Windows
/channel/lifeproger Жизнь программиста. Авторский канал.
/channel/devopslib Библиотека девопса | DevOps, SRE, Sysadmin
/channel/rabota1C_rus Вакансии для программистов 1С
Системное администрирование 📌
/channel/sysadmin_girl Девочка Сисадмин
/channel/srv_admin_linux Админские угодья
/channel/linux_srv Типичный Сисадмин
/channel/linux_odmin Linux: Системный администратор
/channel/devops_star DevOps Star (Звезда Девопса)
/channel/i_linux Системный администратор
/channel/linuxchmod Linux
/channel/sys_adminos Системный Администратор
/channel/tipsysdmin Типичный Сисадмин (фото железа, было/стало)
/channel/sysadminof Книги для админов, полезные материалы
/channel/i_odmin Все для системного администратора
/channel/i_odmin_book Библиотека Системного Администратора
/channel/i_odmin_chat Чат системных администраторов
/channel/i_DevOps DevOps: Пишем о Docker, Kubernetes и др.
/channel/sysadminoff Новости Линукс Linux
1C разработка 📌
/channel/odin1C_rus Cтатьи, курсы, советы, шаблоны кода 1С
/channel/DevLab1C 1С:Предприятие 8
Программирование C++📌
/channel/cpp_lib Библиотека C/C++ разработчика
/channel/cpp_knigi Книги для программистов C/C++
/channel/cpp_geek Учим C/C++ на примерах
Программирование Python 📌
/channel/pythonofff Python академия. Учи Python быстро и легко🐍
/channel/BookPython Библиотека Python разработчика
/channel/python_real Python подборки на русском и английском
/channel/python_360 Книги по Python Rus
Java разработка 📌
/channel/BookJava Библиотека Java разработчика
/channel/java_360 Книги по Java Rus
/channel/java_geek Учим Java на примерах
GitHub Сообщество 📌
/channel/Githublib Интересное из GitHub
Базы данных (Data Base) 📌
/channel/database_info Все про базы данных
Мобильная разработка: iOS, Android 📌
/channel/developer_mobila Мобильная разработка
/channel/kotlin_lib Подборки полезного материала по Kotlin
Фронтенд разработка 📌
/channel/frontend_1 Подборки для frontend разработчиков
/channel/frontend_sovet Frontend советы, примеры и практика!
/channel/React_lib Подборки по React js и все что с ним связано
Разработка игр 📌
/channel/game_devv Все о разработке игр
Библиотеки 📌
/channel/book_for_dev Книги для программистов Rus
/channel/programmist_of Книги по программированию
/channel/proglb Библиотека программиста
/channel/bfbook Книги для программистов
/channel/books_reserv Книги для программистов
БигДата, машинное обучение 📌
/channel/bigdata_1 Data Science, Big Data, Machine Learning, Deep Learning
Программирование 📌
/channel/bookflow Лекции, видеоуроки, доклады с IT конференций
/channel/coddy_academy Полезные советы по программированию
/channel/rust_lib Полезный контент по программированию на Rust
/channel/golang_lib Библиотека Go (Golang) разработчика
/channel/itmozg Программисты, дизайнеры, новости из мира IT
/channel/php_lib Библиотека PHP программиста 👨🏼💻👩💻
/channel/nodejs_lib Подборки по Node js и все что с ним связано
/channel/ruby_lib Библиотека Ruby программиста
QA, тестирование 📌
/channel/testlab_qa Библиотека тестировщика
Шутки программистов 📌
/channel/itumor Шутки программистов
Защита, взлом, безопасность 📌
/channel/thehaking Канал о кибербезопасности
/channel/xakep_2 Хакер Free
Книги, статьи для дизайнеров 📌
/channel/ux_web Статьи, книги для дизайнеров
Математика 📌
/channel/Pomatematike Канал по математике
/channel/phis_mat Обучающие видео, книги по Физике и Математике
Excel лайфхак📌
/channel/Excel_lifehack
/channel/tikon_1 Новости высоких технологий, науки и техники💡
/channel/mir_teh Мир технологий (Technology World)
Вакансии 📌
/channel/sysadmin_rabota Системный Администратор
/channel/progjob Вакансии в IT
❓Хотите стать C#-разработчиком, но боитесь, что будет сложно?
Подготовьтесь заранее и освойте Git — ключевой инструмент командной разработки!
На открытом вебинаре 31 марта в 20:00 мск разберем:
◽️ Систему контроля версий
◽️ Основные команды
◽️ Принципы работы с репозиториями
◽️ Эти знания помогут вам уверенно работать в команде и подготовиться к следующему этапу.
С Git вы сможете эффективно управлять кодом, вести проекты и двигаться к позиции Junior и Middle.
🔗 Регистрируйтесь на вебинар и 🎁 получите скидку на большое обучение «C# Developer»: https://vk.cc/cKdHxS
Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576
📊 Зачем DBA нужно уметь читать планы выполнения запросов (EXPLAIN)?
Почему навык чтения плана выполнения запроса — это не просто галочка в резюме, а реальный способ спасать прод от тормозов и неожиданных фулл-сканов.
Когда приходит запрос от разработчика: "Почему тормозит?" — ты открываешь EXPLAIN (ANALYZE, BUFFERS)
и видишь:
Seq Scan on users (cost=0.00..44231.00 rows=1000000 width=64)
Filter: (status = 'active')
CREATE INDEX
— и запрос летит 🚀
Index Scan using idx_users_status on users
Index Cond: (status = 'active')
Buffers: shared hit=5 read=100000 dirtied=0
— вот оно. Индекс-то используется, но данные не в кэше, приходится читать с диска. А диск медленный. Решение? Подумать о горячем кэше, пачке RAM или REINDEX, если индекс раздулся.🧹 VACUUM FULL — спасение от bloated-таблиц или тихий враг?
Сегодня хочу поговорить о том, что многие DBA используют как "универсальную таблетку" — VACUUM FULL
. Но стоит ли?
💡 Что делает VACUUM FULL:
Он полностью перебирает таблицу и создаёт её заново, убирая все мёртвые строки. Результат — таблица становится компактной, как после дефрагментации. Это помогает, если у тебя:
- Много UPDATE
или DELETE
- Таблица разрослась до абсурдных размеров
- Autovacuum не справляется
🔎 Как понять, что таблица bloated:
SELECT
schemaname, relname,
pg_size_pretty(pg_total_relation_size(relid)) AS total_size,
pg_size_pretty(pg_relation_size(relid)) AS table_size,
(pg_total_relation_size(relid) - pg_relation_size(relid)) AS index_overhead
FROM pg_catalog.pg_statio_user_tables
ORDER BY pg_total_relation_size(relid) DESC;
table_size
сильно больше, чем объём живых данных — у тебя блоат.pg_repack
— он делает примерно то же, но без блокировокautovacuum
+ мониторингVACUUM FULL
в проде? 😏🧠 Почему PostgreSQL иногда "зависает" на UPDATE и как это пофиксить
Сегодня я расскажу про одну интересную особенность PostgreSQL, с которой сталкивался лично: внезапные подвисания при UPDATE
большого количества строк. Причём CPU
почти не загружен, а запрос как будто "висит".
📌 Проблема часто кроется в отсутствии индекса на колонку фильтра в WHERE
. Пример:
UPDATE orders SET status = 'archived' WHERE created_at < '2022-01-01';
created_at
нет индекса, то PostgreSQL делает sequential scan всей таблицы. А теперь внимание: если в таблице много "мертвых" строк, которых ещё не убрал autovacuum, то PostgreSQL должен:
CREATE INDEX idx_orders_created_at ON orders(created_at);
SELECT relname, n_dead_tup, last_vacuum, last_autovacuum
FROM pg_stat_user_tables ORDER BY n_dead_tup DESC;
VACUUM ANALYZE orders;
UPDATE
всё равно медленный, попробуй его разбить на батчи по 10 000 строк. Это снизит нагрузку и ускорит выполнение.💪 Качаем скиллы PostgreSQL!
10 апреля 2025 года пройдет бесплатное комьюнити-мероприятие из серии PG BootCamp Russia — конференция, направленная на приобретение практических навыков при работе с СУБД PostgreSQL.
🔵Программа рассчитана как на начинающих специалистов, так и на более опытных разработчиков, желающих углубить знания в части ядра и экосистемы продукта
🔵 Ведущие эксперты в области СУБД проведут мастер-классы и лекции по наиболее востребованным и интересным темам
🔵Для тех, кто не сможет присутствовать очно, предусмотрена онлайн-трансляция
🧑🎓 Все участники получат электронные сертификаты, подтверждающие приобретение новых знаний и навыков.
📌 Дата и время: 10 апреля, в 10:00 (по ЕКБ)
Формат: офлайн/онлайн
Место проведения: конгресс-отель «Екатеринбург»
✅ Зарегистрируйтесь сейчас и приготовьтесь к захватывающему путешествию в мир СУБД!
Реклама. ООО «ТАНТОР ЛАБС», ОГРН 1217700399949
Подборка Telegram каналов для программистов
/channel/bash_srv Bash Советы
/channel/win_sysadmin Системный Администратор Windows
/channel/lifeproger Жизнь программиста. Авторский канал.
/channel/devopslib Библиотека девопса | DevOps, SRE, Sysadmin
/channel/rabota1C_rus Вакансии для программистов 1С
Системное администрирование 📌
/channel/sysadmin_girl Девочка Сисадмин
/channel/srv_admin_linux Админские угодья
/channel/linux_srv Типичный Сисадмин
/channel/linux_odmin Linux: Системный администратор
/channel/devops_star DevOps Star (Звезда Девопса)
/channel/i_linux Системный администратор
/channel/linuxchmod Linux
/channel/sys_adminos Системный Администратор
/channel/tipsysdmin Типичный Сисадмин (фото железа, было/стало)
/channel/sysadminof Книги для админов, полезные материалы
/channel/i_odmin Все для системного администратора
/channel/i_odmin_book Библиотека Системного Администратора
/channel/i_odmin_chat Чат системных администраторов
/channel/i_DevOps DevOps: Пишем о Docker, Kubernetes и др.
/channel/sysadminoff Новости Линукс Linux
1C разработка 📌
/channel/odin1C_rus Cтатьи, курсы, советы, шаблоны кода 1С
/channel/DevLab1C 1С:Предприятие 8
Программирование C++📌
/channel/cpp_lib Библиотека C/C++ разработчика
/channel/cpp_knigi Книги для программистов C/C++
/channel/cpp_geek Учим C/C++ на примерах
Программирование Python 📌
/channel/pythonofff Python академия. Учи Python быстро и легко🐍
/channel/BookPython Библиотека Python разработчика
/channel/python_real Python подборки на русском и английском
/channel/python_360 Книги по Python Rus
Java разработка 📌
/channel/BookJava Библиотека Java разработчика
/channel/java_360 Книги по Java Rus
/channel/java_geek Учим Java на примерах
GitHub Сообщество 📌
/channel/Githublib Интересное из GitHub
Базы данных (Data Base) 📌
/channel/database_info Все про базы данных
Мобильная разработка: iOS, Android 📌
/channel/developer_mobila Мобильная разработка
/channel/kotlin_lib Подборки полезного материала по Kotlin
Фронтенд разработка 📌
/channel/frontend_1 Подборки для frontend разработчиков
/channel/frontend_sovet Frontend советы, примеры и практика!
/channel/React_lib Подборки по React js и все что с ним связано
Разработка игр 📌
/channel/game_devv Все о разработке игр
Библиотеки 📌
/channel/book_for_dev Книги для программистов Rus
/channel/programmist_of Книги по программированию
/channel/proglb Библиотека программиста
/channel/bfbook Книги для программистов
/channel/books_reserv Книги для программистов
БигДата, машинное обучение 📌
/channel/bigdata_1 Data Science, Big Data, Machine Learning, Deep Learning
Программирование 📌
/channel/bookflow Лекции, видеоуроки, доклады с IT конференций
/channel/coddy_academy Полезные советы по программированию
/channel/rust_lib Полезный контент по программированию на Rust
/channel/golang_lib Библиотека Go (Golang) разработчика
/channel/itmozg Программисты, дизайнеры, новости из мира IT
/channel/php_lib Библиотека PHP программиста 👨🏼💻👩💻
/channel/nodejs_lib Подборки по Node js и все что с ним связано
/channel/ruby_lib Библиотека Ruby программиста
QA, тестирование 📌
/channel/testlab_qa Библиотека тестировщика
Шутки программистов 📌
/channel/itumor Шутки программистов
Защита, взлом, безопасность 📌
/channel/thehaking Канал о кибербезопасности
/channel/xakep_2 Хакер Free
Книги, статьи для дизайнеров 📌
/channel/ux_web Статьи, книги для дизайнеров
Математика 📌
/channel/Pomatematike Канал по математике
/channel/phis_mat Обучающие видео, книги по Физике и Математике
Excel лайфхак📌
/channel/Excel_lifehack
/channel/tikon_1 Новости высоких технологий, науки и техники💡
/channel/mir_teh Мир технологий (Technology World)
Вакансии 📌
/channel/sysadmin_rabota Системный Администратор
/channel/progjob Вакансии в IT
Как индекс может замедлить запрос?
Сейчас разберём интересный парадокс: почему индекс может замедлить выполнение запроса? 🤔
Обычно индекс ускоряет поиск данных, но есть ситуации, когда его использование ведёт к ухудшению производительности. Давайте рассмотрим несколько таких случаев.
🚀 1. Неправильный выбор индекса
Допустим, у нас есть индекс по created_at
, а мы выполняем запрос:
SELECT * FROM orders WHERE YEAR(created_at) = 2024;
YEAR(created_at)
делает так, что индекс не используется эффективно. База данных должна пройтись по всем строкам, применяя функцию ко всем значениям. Лучше переписать так:
SELECT * FROM orders WHERE created_at >= '2024-01-01' AND created_at < '2025-01-01';
INSERT
, UPDATE
, DELETE
. Почему? Потому что каждый раз при изменении данных БД должна обновлять все индексы. Поэтому добавляйте индексы осознанно! status
, но всего три возможных значения ('new'
, 'processing'
, 'done'
). Если в таблице миллионы строк, но мало уникальных значений, индекс бесполезен — оптимизатор может решить, что проще выполнить полный скан таблицы.INDEX(col1, col2, col3)
), но запрос выбирает ещё одну (col4
). Тогда база вынуждена обращаться к самой таблице, что убивает эффективность индекса.EXPLAIN
в MySQL, EXPLAIN ANALYZE
в PostgreSQL).Оптимизируем SQL-запросы – индексы, которые вы могли забыть
Оптимизация SQL-запросов – это как чистка кода: делаешь вовремя, и всё летает, откладываешь – потом разгребаешь баги и тормоза. Сегодня о трёх индексах, которые часто упускают:
✅ Составные индексы
Ошибка: делать индекс на одно поле, если запрос использует WHERE col1 = X AND col2 = Y
.
Правильный индекс:
CREATE INDEX idx_example ON table_name (col1, col2);
ORDER BY
CREATE INDEX idx_order ON table_name (col1 ASC);
FOREIGN KEY
CREATE INDEX idx_fk ON table_name (foreign_key_column);
EXPLAIN ANALYZE
в PostgreSQL или EXPLAIN
в MySQL. 🔔 PostgreSQL уже не справляется? Пора на новый уровень!
В мире больших данных время — главный ресурс. Если вам нужны мощные аналитические запросы, горизонтальное масштабирование и высокая производительность, пора знакомиться с Arenadata DB (Greenplum).
📅 На открытом вебинаре 4 марта в 18:30 МСК разберем:
- Отличия MPP ArenadataDB от PostgreSQL
- Как запускать и останавливать кластер
- Как писать аналитические запросы, чтобы получать максимум
👨🏫 Спикер: Алексей Железной — Senior Data Engineer с большим опытом и широким технологическим стеком.
🔗 Регистрируйтесь и получите скидку на большое обучение «Greenplum для разработчиков и архитекторов баз данных»: https://vk.cc/cIWW7E
Не упустите возможность поднять свои навыки на новый уровень! 💪
Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576
🔥 Оптимизация запросов: Как убрать тормоза в SQL?
Сейчас покажу вам, как ускорить медленный SQL-запрос, который выполняется слишком долго. Если у вас в проекте есть запросы, которые выполняются секундами, а не миллисекундами, пора что-то менять!
🚀 Разбор примера
Допустим, у нас есть такой запрос:
SELECT *
FROM orders
WHERE customer_id = 123
ORDER BY order_date DESC;
customer_id
или order_date
не индексированы, база будет делать полный скан таблицы. ORDER BY
без индекса будет работать медленно. SELECT *
– загружает ненужные колонки и увеличивает нагрузку.
CREATE INDEX idx_orders_customer ON orders(customer_id, order_date DESC);
SELECT order_id, order_date
FROM orders
WHERE customer_id = 123
ORDER BY order_date DESC;
SELECT order_id, order_date
FROM orders
WHERE customer_id = 123
ORDER BY order_date DESC
LIMIT 1;
LIMIT
= в разы быстрее! 🚀 🚀 Подпишись и прокачай свои скилы: лучшие каналы для IT-специалистов 👨💻📲
Папка с каналами для DevOps, Linux - Windows СисАдминов 👍
Папка с каналами для 1С программистов 🧑💻
Папка с каналами для C++ программистов 👩💻
Папка с каналами для Python программистов 👩💻
Папка с каналами для Java программистов 🖥
Папка с книгами для программистов 📚
Папка для программистов (frontend, backend, iOS, Android) 💻
GitHub Сообщество 🧑💻
/channel/Githublib Интересное из GitHub
Базы данных (Data Base) 🖥
/channel/database_info Все про базы данных
Разработка игр 📱
/channel/game_devv Все о разработке игр
БигДата, машинное обучение 🖥
/channel/bigdata_1 Data Science, Big Data, Machine Learning, Deep Learning
QA, тестирование 🖥
/channel/testlab_qa Библиотека тестировщика
Шутки программистов 📌
/channel/itumor Шутки программистов
Защита, взлом, безопасность 💻
/channel/thehaking Канал о кибербезопасности
/channel/xakep_2 Хакер Free
Книги, статьи для дизайнеров 🎨
/channel/ux_web Статьи, книги для дизайнеров
Математика 🧮
/channel/Pomatematike Канал по математике
/channel/phis_mat Обучающие видео, книги по Физике и Математике
Excel лайфхак🙃
/channel/Excel_lifehack
Технологии 🖥
/channel/tikon_1 Новости высоких технологий, науки и техники💡
/channel/mir_teh Мир технологий (Technology World)
Вакансии 💰
/channel/sysadmin_rabota Системный Администратор
/channel/progjob Вакансии в IT
/channel/rabota1C_rus Вакансии для программистов 1С
PostgreSQL 17: архитектура и тюнинг SQL-запросов
Погрузись в архитектуру и прокачай оптимизацию запросов одной из самых популярных open source СУБД – PostgreSQL.
🌐 В программе курса:
🤩 Разберем, как работают СУБД вообще и PostgreSQL в частности: что такое MVCC, ACID, WAL, LRU, PPC/TPC и другие фундаментальные понятия архитектуры баз данных
🤩 Получите свой собственный выделенный облачный PostgreSQL-сервер (8 vCPU, 12G RAM, 100G NVMe) – БЕСПЛАТНО на время обучения предоставляется
🤩 Получите теорию и практику EXPLAIN и EXPLAIN ANALYZE на разных типа запросов
🤩 Изучите архитектуру хранения данных в PostgreSQL, типы и особенности индексов, а также получите полезные советы и трюки оптимизации БД
🗓 Старт курса: 24 апреля. Продолжительность: 5 недель обучения (четверг, 18:00 МСК).
Изучить программу и записаться можно здесь.
🤩Кто мы: R&D-центр Devhands, основатель школы Алексей Рыбак.
Автор курса — Николай Ихалайнен, эксперт по СУБД (ex-Percona), со-основатель MyDB, энтузиаст открытого ПО.
Реклама. ИП Рыбак А.А. ИНН 771407709607 Erid: 2VtzquiQ76e
🎯 Сегодня покажу простой способ ускорить запросы в PostgreSQL, даже не трогая сам SQL-код.
Часто вижу, как разработчики и админы оптимизируют запросы, играя с индексами или переписывая JOIN'ы. Но забывают про один мощный инструмент — ANALYZE
.ANALYZE
обновляет статистику по таблицам. Эта статистика — хлеб для планировщика запросов. Если она устарела, PostgreSQL может выбрать неэффективный план, даже если у вас всё индексировано как надо.
👨🔧 Простой пример:
ANALYZE my_big_table;
JOIN
срабатывает в разы быстрее. Потому что PostgreSQL теперь знает, какие там объемы данных, сколько уникальных значений в колонках и т.п.ANALYZE
в конец процедуры. Это дёшево, но может дать мощный прирост производительности.
VACUUM ANALYZE my_big_table;
🧩 Сегодня покажу вам простой, но крайне полезный приём, как находить “тяжёлые” запросы в PostgreSQL, которые тормозят базу.
📌 Если у вас база под нагрузкой, и “что-то всё стало медленно”, первым делом проверьте:
SELECT pid, now() - query_start AS duration, query
FROM pg_stat_activity
WHERE state = 'active'
ORDER BY duration DESC
LIMIT 5;
query_start
— именно он поможет понять, кто завис и тормозит остальных.
SELECT
calls,
total_time,
mean_time,
query
FROM pg_stat_statements
ORDER BY total_time DESC
LIMIT 10;
mean_time
или calls
по отдельности.Сегодня расскажу вам про одну часто недооценённую, но крайне полезную SQL-фишку — CROSS APPLY в SQL Server (и его аналог в других СУБД — LATERAL
).
Когда обычный JOIN
бессилен
Допустим, у нас есть таблица Orders
, и мы хотим для каждой строки выбрать топ-1 продукт по сумме, но выборка зависит от строки — тут уже обычный JOIN
не справится. Вот пример, где приходит на помощь CROSS APPLY
:
SELECT
o.OrderID,
p.ProductName,
p.Amount
FROM Orders o
CROSS APPLY (
SELECT TOP 1 *
FROM Products p
WHERE p.OrderID = o.OrderID
ORDER BY p.Amount DESC
) p;
CROSS APPLY
?Orders
выполни подзапрос с её параметрами». Это похоже на foreach
, где внутренняя выборка может меняться в зависимости от строки внешней таблицы.
SELECT
o.order_id,
p.product_name,
p.amount
FROM orders o,
LATERAL (
SELECT *
FROM products p
WHERE p.order_id = o.order_id
ORDER BY p.amount DESC
LIMIT 1
) p;
CROSS APPLY
, когда:JOIN
Как работают джойны SQL?
На приведенной ниже схеме подробно показано, как работают 4 типа объединений SQL.
🔹INNER JOIN возвращает совпадающие строки в обеих таблицах
🔹LEFT JOIN возвращает все записи из левой таблицы и соответствующие записи из правой
🔹RIGHT JOIN возвращает все записи из правой таблицы и соответствующие записи из левой
🔹FULL OUTER JOIN возвращает все записи, в которых есть совпадения, в левой или правой таблице
#db
👉 @database_info
Ждать будущее или создавать его? Команда Navio за второй вариант: мы разрабатываем и внедряем инновации, меняющие транспортную отрасль. Вы можете к нам присоединиться!
Мы активно развиваемся и приглашаем в компанию экспертов в области инженерии данных и машинного обучения. Вы будете работать с большими данными и оптимизировать системы. Мы открыты к новым идеям: если у вас появится предложение, будут все возможности реализовать задуманное.
Navio — разработчик технологии автономного вождения с применением искусственного интеллекта. Мы создаём решения, которые делают транспорт безопаснее и комфортнее.
Выбирайте вакансию и отправляйте отклик.
🚀 Ваша база данных уже не справляется с нагрузкой?
Запросы тормозят, индексы не помогают, а миллиарды строк превращают аналитику в настоящую пытку? PostgreSQL умеет работать с Big Data, но важно знать, как правильно его настроить.
📅 На открытом вебинаре 27 марта в 20:00 МСК мы разберем проверенные способы разгона PostgreSQL для высоконагруженных систем.
🔍 На вебинаре мы разберем:
- Как эффективно масштабировать хранилище?
- Когда переходить на партицирование?
- Как объединить PostgreSQL с ClickHouse для быстрой аналитики?
👨🏫 Спикер: Дмитрий Золотов — разработчик мобильных приложений на Flutter в Яндекс Про и ментор.
Вы получите готовые решения, которые позволят вашему PostgreSQL работать быстрее без лишних затрат на инфраструктуру. Разберем реальные кейсы, фейлы и лучшие практики.
💡 Регистрируйтесь и получите скидку на большое обучение «PostgreSQL. Advanced»: https://vk.cc/cKbsuV
Не упустите возможность улучшить производительность вашей базы данных!
Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576, www.otus.ru
Оптимизация запросов: как найти узкое место? 🔍
Привет, коллеги! Сегодня я покажу вам, как находить узкие места в SQL-запросах и оптимизировать их. Если ваш запрос работает медленно, скорее всего, проблема в одном из трех мест:
1️⃣ Неверные индексы
- Проверьте EXPLAIN ANALYZE
, если используется Seq Scan
вместо Index Scan
, значит, индексы либо отсутствуют, либо неэффективны.
- Добавьте индексы на часто фильтруемые и соединяемые поля.
2️⃣ Проблемные JOIN'ы
- Проверьте, какие типы JOIN
используются. NESTED LOOP JOIN
может быть проблемой на больших таблицах.
- Используйте HASH JOIN
или MERGE JOIN
, если это возможно.
3️⃣ Громоздкие операции (GROUP BY, ORDER BY, DISTINCT)
- Сортировка и группировка требуют много ресурсов.
- Можно ли заменить DISTINCT
на EXISTS
?
- Используйте индексированные столбцы в ORDER BY
.
Вот вам задача:
Какой тип JOIN
наиболее эффективен для соединения двух больших таблиц? Пишите свои мысли в комментариях! 👇
#db
👉 @database_info
SQL JOINs наглядно: как работать с объединением таблиц
Хотите лучше понимать SQL JOIN? Вот наглядная шпаргалка с примерами и визуализацией!
🔹 INNER JOIN – пересечение двух таблиц, возвращает только совпадающие строки.SELECT *
FROM A
INNER JOIN B ON A.key = B.key;
🔹 FULL JOIN – объединяет все данные из обеих таблиц, заполняя пропущенные значения NULL.SELECT *
FROM A
FULL JOIN B ON A.key = B.key;
🔹 FULL JOIN с фильтрацией NULL – выбирает только строки, которые есть только в одной из таблиц.SELECT *
FROM A
FULL JOIN B ON A.key = B.key
WHERE A.key IS NULL OR B.key IS NULL;
🔹 LEFT JOIN – возвращает все строки из A и совпадающие строки из B.SELECT *
FROM A
LEFT JOIN B ON A.key = B.key;
🔹 LEFT JOIN (только уникальные в A) – возвращает только строки из A, которых нет в B.SELECT *
FROM A
LEFT JOIN B ON A.key = B.key
WHERE B.key IS NULL;
🔹 RIGHT JOIN – аналогично LEFT JOIN, но с приоритетом B.SELECT *
FROM A
RIGHT JOIN B ON A.key = B.key;
🔹 RIGHT JOIN (только уникальные в B) – выбирает строки, которые есть в B, но отсутствуют в A.SELECT *
FROM A
RIGHT JOIN B ON A.key = B.key
WHERE B.key IS NULL;
Сохраняйте в закладки и пользуйтесь! ⚡
#db
👉 @database_info
Визуализация SQL-запросов
Ментальная модель, помогающая представить, как выполняются SQL-запросы.
Фактическая последовательность выполнения может отличаться от этой модели из-за стратегий оптимизации, применяемых оптимизатором запросов.
#db
👉 @database_info
Комплексное техническое руководство для опытных администраторов баз данных: Обеспечение целостности данных
Обеспечение целостности данных критически важно для надежной и эффективной работы базы данных. В этом руководстве рассматриваются лучшие практики валидации данных, нормализации и резервного копирования, а также стратегии выявления и исправления несоответствий в данных.
https://bookflow.ru/kompleksnoe-tehnicheskoe-rukovodstvo-dlya-opytnyh-administratorov-baz-dannyh-obespechenie-tselostnosti-dannyh/
#db
👉 @database_info
🔍 Как ускорить SELECT в больших таблицах?
Сегодня расскажу, как можно ускорить выборку данных из больших таблиц. Если у вас запрос SELECT
тормозит, попробуйте эти методы:
1️⃣ Индексы
Без индексов даже самый мощный сервер не спасёт. Используйте B-Tree для точных совпадений (=
) и диапазонов (BETWEEN
). Для полнотекстового поиска — GIN или Full-Text Index.
2️⃣ EXPLAIN ANALYZE
Перед оптимизацией всегда проверяйте план запроса:
EXPLAIN ANALYZE SELECT * FROM orders WHERE status = 'pending';
SELECT * FROM logs ORDER BY created_at DESC LIMIT 10;
CREATE MATERIALIZED VIEW fast_report AS
SELECT status, COUNT(*) FROM orders GROUP BY status;
REFRESH MATERIALIZED VIEW fast_report;
🔥 Оптимизация индексов: частая ошибка DBA 🔥
Сегодня разберём распространённую ошибку, которую совершают многие администраторы баз данных — избыточные индексы.
💡 Проблема
Добавление индексов — это полезно, но если их становится слишком много, то база данных начинает тормозить при вставке, обновлении и удалении данных. Почему? Потому что каждый индекс требует дополнительного обслуживания при изменениях в таблице.
💡 Пример ошибки
Представим таблицу orders
:
CREATE TABLE orders (
id SERIAL PRIMARY KEY,
customer_id INT NOT NULL,
order_date DATE NOT NULL,
total DECIMAL(10,2) NOT NULL
);
CREATE INDEX idx_customer ON orders(customer_id);
CREATE INDEX idx_order_date ON orders(order_date);
CREATE INDEX idx_customer_order_date ON orders(customer_id, order_date);
idx_customer_order_date
покрывает оба предыдущих индекса! idx_customer
и idx_order_date
, так как составной индекс (idx_customer_order_date
) способен выполнять их работу.
SELECT indexrelid::regclass, pg_size_pretty(pg_relation_size(indexrelid))
FROM pg_stat_user_indexes
ORDER BY pg_relation_size(indexrelid) DESC;
SHOW INDEX FROM orders;
📍Геоданные и временные ряды в Spark: хаос или порядок?
GPS-координаты, карты, временные метки — данные есть, но как с ними работать? Стандартные методы тормозят, запросы громоздкие, аналитика требует вечности.
💡Есть решение. На открытом вебинаре «Обработка геопространственных и временных данных на Spark» 11 марта в 20:00 (мск):
- Разберём пространственные данные: координаты, маршруты, карты
- Научимся анализировать временные ряды с трендами и предсказаниями
- Проанализируем реальные кейсы: GPS-данные, сенсоры IoT, анализ движения
📢 Спикер Вадим Заигрин — опытный разработчик, Data Engineer и Data Scientist. Team Lead команд инженеров данных на разных проектах.
Все участники получат скидку на большое обучение «Spark Developer».
➡️ Регистрируйтесь, чтобы не пропустить: https://vk.cc/cIVWOdРеклама. ООО «Отус онлайн-образование», ОГРН 1177746618576