Тёмный

Оптимизация SQL запроса 

Eugene Suleimanov
Подписаться 28 тыс.
Просмотров 14 тыс.
50% 1

В данном видео мы на практическом примере разбираем основы оптимизации SQL запроса и рабочие инструменты.
Дружное сообщество:
t.me/pse_club
Материалы для разработчиков:
proselyte.net/
Ссылка на GitHub репозиторий с запросами:
github.com/proselytear/sql_op...
00:00:00 Введение
00:00:52 Создание структуры данных
00:02:25 Выполнение первой версии запроса
00:04:30 EXPLAIN и EXPLAIN ANALYZE
00:08:22 Первая оптимизация запроса и анализ производительности
00:11:12 Добавление индексов
00:12:47 Non-SARGable функция EXTRACT и сравнение производительности с первым запросом
00:15:39 Вывод

Опубликовано:

 

4 май 2024

Поделиться:

Ссылка:

Скачать:

Готовим ссылку...

Добавить в:

Мой плейлист
Посмотреть позже
Комментарии : 121   
@qaserus1226
@qaserus1226 4 месяца назад
Спасибо большое. Как идея, видео об транзакциях, аннотации @Transactional, уровнях изоляции, а так же локах на таблицы и избежание deadlock))
@EugeneSuleimanov
@EugeneSuleimanov 4 месяца назад
Спасибо за отзыв и идею :)
@user-bt9hx3ik6e
@user-bt9hx3ik6e 4 месяца назад
какое офигенное видео! большое спасибо, Евгений!очень полезно и без воды. как идея-было бы неплохо рассмотреть оптимизацию ресурсов и поиск утечек памяти(с помощью VisualVM к примеру)
@EugeneSuleimanov
@EugeneSuleimanov 4 месяца назад
Спасибо за поддержку! Это тоже есть планах :)
@admiralakbar1936
@admiralakbar1936 4 месяца назад
@@EugeneSuleimanov тоже интересно (и как анализировать heap dump)
@sergeydegtiarev1795
@sergeydegtiarev1795 4 месяца назад
Ёмко. Без воды. Доброжелательная подача. Спасибо)
@EugeneSuleimanov
@EugeneSuleimanov 4 месяца назад
Спасибо за отзыв :)
@anjelomanoranjan3908
@anjelomanoranjan3908 4 месяца назад
Бомбическое видео! Я горжусь тем, что мой преподаватель по Java сам пишет профессиональные статьи. Спасибо тебе, Женя, большое))
@EugeneSuleimanov
@EugeneSuleimanov 4 месяца назад
Спасибо за отзыв :)
@user-lx4dc1ls3e
@user-lx4dc1ls3e 4 месяца назад
Классное и очень полезное видео, прям во время вышло!!! Спасибо, Евгений👍👍👍
@EugeneSuleimanov
@EugeneSuleimanov 4 месяца назад
Спасибо за поддержку!
@AnnaSmirnova1
@AnnaSmirnova1 4 месяца назад
Спасибо Евгений, лаконично и понятно
@EugeneSuleimanov
@EugeneSuleimanov 4 месяца назад
Спасибо за отзыв!
@ZamalSpace
@ZamalSpace 4 месяца назад
Быстро, ёмко, полезно. Спасибо за видео про оптимизацию запросов. Однозначно хотелось бы продолжение. Было бы здорово серия видео на тему оптимизации запросов и заигрывания с индексами.
@EugeneSuleimanov
@EugeneSuleimanov 4 месяца назад
Спасибо за отзыв и идею!
@user-lk8n0fgjk
@user-lk8n0fgjk 3 месяца назад
Благодарность за классный и ценный ролик
@EugeneSuleimanov
@EugeneSuleimanov 3 месяца назад
Спасибо за поддержку!
@user-xu3px8pu4t
@user-xu3px8pu4t 4 месяца назад
Большое спасибо.Как же я соскучился за всем этим)
@EugeneSuleimanov
@EugeneSuleimanov 4 месяца назад
Спасибо за отзыв!
@MultiKenes
@MultiKenes Месяц назад
Лучший)) Коротко. Чётко. Ёмко. Полезно. Жаль, что пока мало видосов на канале. Не бросайте это дело
@EugeneSuleimanov
@EugeneSuleimanov Месяц назад
Спасибо за поддержку!
@MO3rOBOuBbICEP
@MO3rOBOuBbICEP 4 месяца назад
Полезный видосик, спасибо!
@EugeneSuleimanov
@EugeneSuleimanov 4 месяца назад
Спасибо за комментарий!
@ratsmasher
@ratsmasher 4 месяца назад
Евгений, огромное спасибо за видео! Как раз сейчас разбираюсь с индексами и оптимизацией запросов. Очень коротко и максимально понятно, а что самое главное нужно любому бэкенд разработчику.
@EugeneSuleimanov
@EugeneSuleimanov 4 месяца назад
Спасибо за отзыв!
@user-fy7qn9bv7y
@user-fy7qn9bv7y Месяц назад
Супер ! спасибо огромное, Евгений!)
@EugeneSuleimanov
@EugeneSuleimanov Месяц назад
Большое спасибо за отзыв!
@zvuk3316
@zvuk3316 4 месяца назад
Большое спасибо за такое полезное видео!)
@EugeneSuleimanov
@EugeneSuleimanov 4 месяца назад
Спасибо за поддержку!
@iamusayev1337
@iamusayev1337 4 месяца назад
Лучший! Продолжайте пожалуйста в том же духе, с наступающим, всех благ
@EugeneSuleimanov
@EugeneSuleimanov 4 месяца назад
Большое спасибо за отзыв и поздравления! С наступающими праздниками!!!
@zicksu2142
@zicksu2142 Месяц назад
Евгений, после просмотра видео очень хочется пожать вам руку и сказать СПАСИБО!
@EugeneSuleimanov
@EugeneSuleimanov Месяц назад
Большое спасибо за отзыв!
@user-ol9iu4iy6i
@user-ol9iu4iy6i 4 месяца назад
Искал медь, нашёл золото - это про канал Евгения)
@EugeneSuleimanov
@EugeneSuleimanov 4 месяца назад
Спасибо за поддержку :)
@Devivl
@Devivl 4 месяца назад
Как всегда, огромное спасибо, Евгений. Ёмко и понятно. Узнал об удобстве DataGrip и о cost'ах. Буду тестировать. Всё сводится к анализу и, как следствие, удалению избыточных запросов (информации). Воочию представил насколько отсутствие оптимизации влияет на ресурсы и время предоставления информации, хотя таблица состоит всего из нескольких записей. Спасибо!
@EugeneSuleimanov
@EugeneSuleimanov 4 месяца назад
Большое спасибо за отзыв!
@spezdm
@spezdm 4 месяца назад
Блогодарю за полезное видео
@EugeneSuleimanov
@EugeneSuleimanov 4 месяца назад
Спасибо за комментарий!
@cosmo_polit
@cosmo_polit 4 месяца назад
thanks, that was very helpfull
@EugeneSuleimanov
@EugeneSuleimanov 4 месяца назад
Thank you for the comment!
@bryanin
@bryanin 4 месяца назад
Очень круто. Супер лайк
@EugeneSuleimanov
@EugeneSuleimanov 4 месяца назад
Спасибо за отзыв!
@user-qx3jt8fw1v
@user-qx3jt8fw1v 4 месяца назад
да ты мое золото. просто лучший!
@EugeneSuleimanov
@EugeneSuleimanov 4 месяца назад
Спасибо за поддержку!
@dmitriysavinov9906
@dmitriysavinov9906 4 месяца назад
Супер полезное видео!
@EugeneSuleimanov
@EugeneSuleimanov 4 месяца назад
Спасибо за отзыв!
@user-qm5hv2dc7h
@user-qm5hv2dc7h 4 месяца назад
Спасибо!🙂
@EugeneSuleimanov
@EugeneSuleimanov 4 месяца назад
Спасибо за комментарий!
@Lenz_86
@Lenz_86 4 месяца назад
Евгений, спасибо за контент! Ещё мой руководитель на проекте говорит что нужно всегда избегать подзапросов, практически всегда можно обойтись без них, а на производительность они влияют очень сильно
@EugeneSuleimanov
@EugeneSuleimanov 4 месяца назад
Спасибо за отзыв!
@klaussr
@klaussr 4 месяца назад
А зачем же мы их так усиленно учим))
@zvuk3316
@zvuk3316 4 месяца назад
"Практически всегда можно обойтись без них" - громко сказано)
@user-ur7bn1kd1p
@user-ur7bn1kd1p 3 месяца назад
Совет от бывалых: не пытайтесь всё сразу вытащить одним запросом из кучи таблиц, бывает гораздо быстрее сделать 2 последовательных запроса. На очень больших таблицах добавляет скорости отсечь ненужные в выборке данные по первичному ключу. Сравнивать лонги проще, чем даты, особенно если дата имеет косвенную/прямую связь с порядком автоинкрементного первичного ключа.
@user-yn1pk3bz2r
@user-yn1pk3bz2r 4 месяца назад
Женя - топовый чувак
@EugeneSuleimanov
@EugeneSuleimanov 4 месяца назад
Спасибо за поддержку!
@Fikusiklol
@Fikusiklol Месяц назад
Хороший пример для начала, но если посмотреть в последнем плане, то: 1) кверя выполняется дольше, вероятно изза кеша 2) фул скан таблицы, т.е убери индексы и ничего не изменится))
@EugeneSuleimanov
@EugeneSuleimanov Месяц назад
Спасибо за комментарий! Да, согласен, что с точки зрения реалистичности этих сценариев много вопросов. Цель видео - это познакомить зрителя с инструментарием.
@romankryvolapov7961
@romankryvolapov7961 4 месяца назад
Я бы сказал, что описанние в видео выглядит не как оптимизация, а скорей как просто логика и понимание принципов работы с базой данных, да и запросы очень простые, чтобы заморачиваться с их оптимизацией. Было бы интересно посмотреть на более сложные варианты запросов, где например используется последовательная выборка из множества таблиц, где по данным из первой ищется во второй, а затем например по данным из первой и второй ищется по третьей или что то подобное, ну то есть где возможны разные варианты и нужно выбрать оптимальный, ну или запрос выдает строки со связанными данными из разных таблиц, в таких запросах с кучей join и вложенными запросами действительно есть что оптимизировать. На одном из проектов сейчас как раз такая тема- дофига сложные запросы на пол экрана, и мне кажется, рано или поздно сталкиваешься с такими проектами, и тогда понимаешь, что не шаришь в sql)) А по работе с datagrip- вот это интересно! Стыдно признаться, о нем даже на слышал)) но выглядит круто
@EugeneSuleimanov
@EugeneSuleimanov 4 месяца назад
Спасибо за комментарий!
@SplashDmg2011
@SplashDmg2011 4 месяца назад
В IDEA Ultimate это все тоже есть - и explain в удобном виде, и визуализация
@ercefwxdx
@ercefwxdx 4 месяца назад
Дякую
@EugeneSuleimanov
@EugeneSuleimanov 4 месяца назад
Дякую за коментар!
@ManticoreRoko
@ManticoreRoko 4 месяца назад
Отличная подача материала, доступно и полезно. Вопрос: не вредно ли добавлять >1 индекса в одну таблицу в OLTP СУБД?
@EugeneSuleimanov
@EugeneSuleimanov 4 месяца назад
Спасибо за отзыв! Здесь нужно искать компромисс, ведь вставка замедлится. Но зависит от контекста задачи.
@konstantinmatushenko5831
@konstantinmatushenko5831 4 месяца назад
Спасибо за видео. Вы в практике часто используете функцию extract? Я вроде ни разу не использовал
@EugeneSuleimanov
@EugeneSuleimanov 4 месяца назад
Спасибо за отзыв! Нет, не использую, но несколько раз видел. Это учебный пример.
@chip253
@chip253 4 месяца назад
Полное сканирование сразу понятно было. Странно описание таблиц не полное, где developer_id unsigned int not null (default допустим не нужно) - на ревью завалится. Потом created_at тоже not null default now... Про экспрес функцию многие забывают - важный аспект.
@EugeneSuleimanov
@EugeneSuleimanov 4 месяца назад
Спасибо за комментарий! Разумеется, это не «боевой» код.
@user-tr7qp1dt3i
@user-tr7qp1dt3i 4 месяца назад
Спасибо за видео! Вопрос. А есть ли смысл в данном случае вместо двух индексов сделать один индекс на 2 поля (developer_id и created_at)? поскольку джойн по им обоим одновременно идет
@EugeneSuleimanov
@EugeneSuleimanov 4 месяца назад
Да, можно попробовать сделать такой индекс. Спасибо за отзыв!
@svetlana4530
@svetlana4530 4 месяца назад
Спасибо за видео! Для учебных целей очень хорошо, наглядно - многие начинающие просто пишут запросы лишь бы заработало. Оптимизация - это следующая ступень эволюции 😊 Есть ли бесплатный аналог инструмента, которым вы пользовались, доступный из России без всяких vpn-ухищрений?
@EugeneSuleimanov
@EugeneSuleimanov 4 месяца назад
Спасибо за отзыв! Касательно аналога - PG Admin - стандартный интерфейс.
@svetlana4530
@svetlana4530 4 месяца назад
@@EugeneSuleimanov спасибо, но, кажется там нет наглядного отображения плана запроса. Или есть?
@EugeneSuleimanov
@EugeneSuleimanov 4 месяца назад
@@svetlana4530 верно, только raw описание, к сожалению.
@BGlazyrin
@BGlazyrin 4 месяца назад
Урок получился симпатичный, но демонстрировать оптимизацию на 5 записях... Ну, такое. На малом кол-ве строк индексы могут мешать, а не ускорять. В Oracle'овых БД для тесткейсов часто используем генераторы строк вида "select rownum id, lpad('x',30,'x') from dual connect by level
@EugeneSuleimanov
@EugeneSuleimanov 4 месяца назад
Спасибо за комментарий! Цель - показать именно основы, потому что многие люди никогда не сталкивались с таким типом задач в принципе. А реальная оптимизация куда сложнее и коварнее.
@BGlazyrin
@BGlazyrin 4 месяца назад
@@EugeneSuleimanov Да я же не агитирую Вас усложнить сам запрос и его анализ. Не хотите объяснять работу генератора строк, скажите, что не поленились и написали 10 тыс insert'ов руками. Тогда и результат оптимизации в секундах будет более существенным.
@user-ur7bn1kd1p
@user-ur7bn1kd1p 3 месяца назад
Если придираться, то тогда для более верного сравнения стоимости запроса лучше выполнять его на разных данных и несколько раз.
@rudolfsikorsky7900
@rudolfsikorsky7900 Месяц назад
Спасибо. К сожалению, вся эта красота от JetBrains работает не со всеми БД. И если бы Евгений писал не свой большой и красивый монитор, а маленький - ноутбучный, то зрителям было бы видно гораздо лучше :)
@EugeneSuleimanov
@EugeneSuleimanov Месяц назад
Спасибо за комментарий! По размеру шрифта, постараюсь учесть и справить на будущее :)
@aksndr61
@aksndr61 4 месяца назад
А можно ж было сделать функциональный индекс с экстрактом месяца по колонке с датой. Или виртуальную колонку, плюс партиционирование по ней.
@EugeneSuleimanov
@EugeneSuleimanov 4 месяца назад
Это уже не основы, а несколько более продвинутый подход. И спасибо за комментарий.
@aazubakin
@aazubakin 4 месяца назад
Получается индекс из таблицы из которой мы пишем forieng key не создается автоматом при указании связи (developer_id) а создается у той таблицы на которую ссылаемся developers_id?
@EugeneSuleimanov
@EugeneSuleimanov 4 месяца назад
Верно, Postgres не создает индекс для внешнего ключа автоматически. Автоматически создаются индексы для первичных ключей и уникальный полей.
@Ellek1ng
@Ellek1ng 4 месяца назад
Отличное видео, спасибо большое!
@EugeneSuleimanov
@EugeneSuleimanov 4 месяца назад
Спасибо за отзыв!
@admiralakbar1936
@admiralakbar1936 4 месяца назад
6:38 а как получилась итоговая сложность? она где-то написана в выводе explain-а (не вижу), или вручную пришлось сложить сложности? Большое спасибо за видео, качественно и информативно. Про explain на собеседованиях уже спрашивали, теперь понятно откуда начинать)
@EugeneSuleimanov
@EugeneSuleimanov 4 месяца назад
Да, просто сложил общую сложность :)
@paskonat
@paskonat 4 месяца назад
Когда невозможно придраться к форме, придираются к содержанию. Евгений, у Вас в конечный результат не попадает 1 января, и, соответственно, вся аналитика идет по другой борозде. ))
@EugeneSuleimanov
@EugeneSuleimanov 4 месяца назад
Справедливо :) Спасибо за комментарий!
@Kentatsu1
@Kentatsu1 4 месяца назад
В конечном итоге можно ведь сократить запрос до обычного селекта по таблице tasks, джоин лишний
@EugeneSuleimanov
@EugeneSuleimanov 4 месяца назад
Здесь был задел на то, что будут запрещены данные developer. Но и пример учебный.
@Krasnolesye
@Krasnolesye 4 месяца назад
Со смартфона - ничего не могу разобрать, сильно мелко. А так материал - ОК. Спасибо
@EugeneSuleimanov
@EugeneSuleimanov 4 месяца назад
Спасибо за комментарий!
@user-xg6so1kq3z
@user-xg6so1kq3z 4 месяца назад
+
@EugeneSuleimanov
@EugeneSuleimanov 4 месяца назад
Спасибо за поддержку!
@coolbrain
@coolbrain 4 месяца назад
Jetbrains со своим Data Grip послал Россиию на 3 буквы насколкьо я знаю, или что то поменялось ? У меня все платные аккаунты заблочили в этом году
@artemseleznev3469
@artemseleznev3469 2 месяца назад
фактологическая ошибка.... косты не надо суммировать, их общая стоимость уже приведена в первой строке explain
@EugeneSuleimanov
@EugeneSuleimanov 2 месяца назад
Спасибо за уточнение!
@Oldstav
@Oldstav 4 месяца назад
Это просто отвратительно 2:30 Автор: Давайте выполним вот такой запрос Ответ: давайте мы не выполним такой запрос… Для того чтобы писать запросы а тем более их оптимизировать, нужна четко поставленная задача от заказчика. И где оно? Т.е. берем какой-то работающий запрос от балды из продакшина и без постановки начинает его «оптимизировать». Ты условие начальное видел, что убираешь один джоин и меняешь тип второго? Как можно менять extract на интервал, если там дата не за один год? Ну добавь 01-01-2022 и результат не сойдется. Про функциональный индекс на базе extract автор даже и не думал. Вопрос автору - куда ты лезешь ничего не понимая в предметной области и что ты хотел донести до аудитории? А потом все слушатели которые тут отлайкали начнут с таким подходом писать такой же говнокод и таким же подходом - читай со свиным рылом лезть в калашный ряд - продакшин
@EugeneSuleimanov
@EugeneSuleimanov 4 месяца назад
Спасибо за ваше мнение.
@user-ur7bn1kd1p
@user-ur7bn1kd1p 3 месяца назад
Всем икспердам желаю меньше пафоса. Ведь вы никогда не расскажете, как сами пока росли облажались не раз на коммерческих проектах.
@PurpleDaemon_
@PurpleDaemon_ 4 месяца назад
11:42 это опять внешний ключ, индекс и так был.
@EugeneSuleimanov
@EugeneSuleimanov 4 месяца назад
В Postgres внешний ключ по умолчанию не индексируется. Только первичный и unique constraint.
@dmytromatvieiev8932
@dmytromatvieiev8932 4 месяца назад
Цікаво, що ваш сайт заблокований для доступу з України)
@EugeneSuleimanov
@EugeneSuleimanov 4 месяца назад
Проверю, спасибо за сигнал.
@rustregas93
@rustregas93 4 месяца назад
И зачем суммировать стоимость костов? тебе последний шаг и так сумму выдал всех предыдущих шагов.
@N5O1
@N5O1 4 месяца назад
неужели ютуб начал советовать нормальные материалы =)
@EugeneSuleimanov
@EugeneSuleimanov 4 месяца назад
Спасибо за комментарий!
@alekseysverbeev2934
@alekseysverbeev2934 4 месяца назад
Обзор инструментов интересный, но конечно оптимизация притянута за уши, потому что изначальный пример взят из книги "как писать не надо". Такие вещи и интуитивно понятны, никто же в здравом уме не будет сравнивать месяц в дате с единицей - это как минимум даст неверные данные (за все года). Интересно было бы посмотреть как оптимизировать запрос который большой, "всю жизнь" работал, но под увеличенными нагрузками устал.
@EugeneSuleimanov
@EugeneSuleimanov 4 месяца назад
Спасибо за комментарий! Пример как делать не нужно из палаты мер и весов :)
@user-dp6jy9qk5q
@user-dp6jy9qk5q 4 месяца назад
полная чушь расскажите хотя бы человеку, что бывает предварительный план выполнения, а бывает реальный
@EugeneSuleimanov
@EugeneSuleimanov 4 месяца назад
ИМХО для человека, который только знакомится с оптимизацией запросов - это уже не совсем основы. Более серьёзные подходы и теоретическая база требует большего времени.
@ThomasLinkzat
@ThomasLinkzat 4 месяца назад
Очень мало обьяснения понятий. Что за начальная сложность, что за конечная сложность. Не обьяснили чем скобки помешали. Не обьяснили этапы которые почему то ушли после оптимизации. Очень сумбурное видео. Вам не хватает сценария чтоли. Но идея хорошая.
@EugeneSuleimanov
@EugeneSuleimanov 4 месяца назад
Спасибо за отзыв и вообще мнение!
@blindbird1619
@blindbird1619 Месяц назад
Странная оптимизация. "Уберем лишнюю таблицу из запроса"... Дак это так можно надобавлять в запрос 50 ненужных таблиц, а потом героически с ними справиться. Кто будет добавлять в свои запросы ненужные таблицы?
@sergeykovalev7276
@sergeykovalev7276 4 месяца назад
Евгений спасибо огромное! У вас есть ошибка в последнем запросе: должно быть created_at >= '2023-01-01', но на результат не влияет
@EugeneSuleimanov
@EugeneSuleimanov 4 месяца назад
Спасибо за отзыв! Да, уже подсказали об ошибке, спасибо :)
Далее
Что такое Kubernetes?
12:49
Просмотров 7 тыс.
Database Indexing for Dumb Developers
15:59
Просмотров 33 тыс.
Разбираем основы Kafka и RabbitMQ
26:54
Будущее программирования
28:16
Виртуальные потоки в Java
23:00
Просмотров 9 тыс.
Ключевые структуры данных
50:39