Это видео недоступно.
Сожалеем об этом.

Оптимизация SQL запросов в Microsoft SQL Server - Индексы

Поделиться
HTML-код
  • Опубликовано: 11 фев 2019
  • Рекомендую также посмотреть видео: • Индексы баз данных - П...
    Более новая версия этого видео: • Оптимизация запросов с...
    В этом видео я начинаю разговор о том, как оптимизировать SQL запросы под MS Sql Server. Начнем с простого и базового понятия - статистики выполнения, на которую проще всего взглянуть и она очень часто сразу же говорит, что где-то скрывается серьезная проблема. Это не единственный показатель, но на мой взгляд один из основных. Помимо этого начинаем знакомится с индексами, возможные проблемы с неверными типами данных и т.д.
    Я покажу, как создание индекса влияет на статистику и производительность, а так же как работает include колонок для индексов
    Текстовая версия этого видео:
    www.flenov.inf...
    Мой ИТ блог www.flenov.ru и www.flenov.info
    Мой просто блог blo.moe
    Facebook: / mikhailflenov
    Tweeter: / flenov
    Инстаграмм: / mflenov
    Телеграмм: mflenov
    Обо мне - Михаил Фленов - блогер, программист, бывший автор журнала Хакер (рубрики Кодинг и FAQ) и автор нескольких книг по программированию и безопасности. Хакером не являюсь, но безопасностью интересуюсь, в основном в области Web. Живу и работаю в Канаде с 2009-го года, в течении 9 лет работал на Sony и отвечал за их крупнейший e-commerce веб сайт

Комментарии • 90

  • @programisli
    @programisli  3 года назад +1

    ОБНОВЛЕННАЯ ВЕРСИЯ ЭТОГО ВИДЕО ruclips.net/video/-62RlA0erW8/видео.html

  • @darknet106
    @darknet106 5 лет назад +4

    Михаил давно ждал это видео,а именно про оптимизацию базы данных, будем ждать ещё видео на схожие темы,а то снимаете уроки только для c# разработчиков,а за вами наблюдают не только с# разработчики)

    • @programisli
      @programisli  5 лет назад +4

      Спасибо, пока видео смотрят и они вызывают положительную реакцию есть смысл продолжать.

  • @suzansuzan2779
    @suzansuzan2779 2 года назад +1

    Огромное спасибо, очень и очень рада что наткнулась на ваш канал , тема сложная но благодаря вашим примерам оказалось очень лёгким !!! 👍☀️

  • @user-hr4me7ei3v
    @user-hr4me7ei3v 3 года назад +2

    Спасибо за очень понятное, хорошо структурированное и проиллюстрированное изложение. Очень доступно
    Подписался

  • @kabukijoe99
    @kabukijoe99 2 года назад +1

    Ставлю лайки под всеми Вашими уроками. Уроки класс и к стати самая понятная книга по С#

  • @v4nd4ll35
    @v4nd4ll35 4 года назад +2

    Спасибо! Помню Вас ещё по журналу ][акер..)
    Не делает каст к varchar из за приоритета типов, неявный каст идёт от меньшего к большему. Поэтому идёт преобразование к nvarchar а не наоборот.
    Тема индексирования изъезжена вдоль и поперек.. Интересно было бы послушать интересные истории про опыт работы с транзакциями, какие проблемы возникали, успешные решения, типа энд Трикс))

  • @FalconSpaceRu
    @FalconSpaceRu 5 лет назад +2

    Полезно и все по сути без воды. спасибо, Михаил!

    • @programisli
      @programisli  5 лет назад

      Спасибо за просмотр

  • @alexzir
    @alexzir 2 года назад +1

    хорошая подача, спасибо!

    • @programisli
      @programisli  2 года назад +1

      На другом канале есть более свежая версия - смотри здесь: ruclips.net/p/PLSn-RgjO4U6TAVsa9RWcGXrUdFUXM7weE

  • @FishingFamily_UA
    @FishingFamily_UA 3 года назад +1

    Благодарю Вас за этот труд и подаренный опыт!
    Очень интересно, хотелось бы видеть как можно больше информации (практической) по sql.
    Дай Бог вам здоровья!

    • @programisli
      @programisli  3 года назад +2

      Все, что касается sql и вообще практической информации переехало на мой канал Програмысли видеоуроки ruclips.net/channel/UCUNOyHuefhPZdHMebCffljg

  • @aleksandercross5936
    @aleksandercross5936 4 года назад +1

    Очень понравилось! Решил узнать что-либо о индексах, и выбрал это видео. Спасибо

    • @programisli
      @programisli  4 года назад +1

      У меня есть несколько видео на эту тему. Вот список www.flenov.info/video/category/SQL

    • @aleksandercross5936
      @aleksandercross5936 4 года назад

      @@programisli благодарю

  • @yu.diachenko7889
    @yu.diachenko7889 5 лет назад +2

    Бомба. Надо будет еще не 1 раз пересмотреть. Спасибо.

  • @user-fv3jg2je6b
    @user-fv3jg2je6b 4 года назад +2

    Спасибо за уроки, Михаил! Очень полезно, все по делу.
    П.С. Увидел фамилию и вспомнил, как еще в нулевых книги всякие выходили "... глазами хакера" ).

    • @programisli
      @programisli  4 года назад

      Спасибо, скоро планирую продолжить

    • @VitaliyZlobin
      @VitaliyZlobin 3 года назад

      @@programisli SQL глазами хакера?

  • @EugeneSkakun
    @EugeneSkakun 2 года назад +1

    оч круто респект и уважуха

  • @tsa157
    @tsa157 4 года назад +1

    Неплохое видео, без лишней воды. Лайк.

    • @programisli
      @programisli  4 года назад

      Спасибо, приятненько получать лайки

  • @elmanaliyev1770
    @elmanaliyev1770 3 года назад

    Изложение очень доходчивое, примеры достаточно хороши, чтобы понять суть.
    Большое спасибо!

  • @ArtemKuznetsovTV
    @ArtemKuznetsovTV 5 лет назад +21

    Хочу записать видео SQL vs NoSQL, т.к. последние 5 лет жил на разных NoSQL базах. Как думаешь, актуально?

    • @programisli
      @programisli  5 лет назад +3

      Я думаю да

    • @user-bc8pr5up2r
      @user-bc8pr5up2r 5 лет назад

      запиши как сделать так, чтоб один код в сайт, в exe и на смартфон и на линукс и на мак запускался , и шоб там бд была

    • @ArtemKuznetsovTV
      @ArtemKuznetsovTV 5 лет назад

      @@user-bc8pr5up2r Очень непонятная формулировка вопроса. Но вобще .net core вполне работает на всех платформах.

    • @keeper-volok
      @keeper-volok 5 лет назад

      От зрителя подтвержу, что актуально

    • @HomosErectus87
      @HomosErectus87 3 года назад +1

      Зачем спрашивал?)) ничего не записал)

  • @VitaliyZlobin
    @VitaliyZlobin 4 года назад +1

    Это просто вау, благодарю) Надеюсь на продолжение, тогда русскоязычные сайты станут немного(намного) быстрее)))
    Помнится недавно канал перевалил за 1к, сейчас 3+. Круто!

    • @programisli
      @programisli  4 года назад

      есть еще два видео продолжения ruclips.net/p/PLqaIQ6A7Xiq02xS3Ii04uSDpKz76Wch35

  • @user-pq2jz8he5s
    @user-pq2jz8he5s 3 года назад +1

    update youtube set like = '+100500 к карме автора видео'. Очень полезная инфа😊

  • @vm7738
    @vm7738 3 года назад +1

    Спасибо, очень интересно было. С примером так вообще запомню))

  • @JustEnergyFlow
    @JustEnergyFlow 2 года назад +1

    Спасибо большое)

    • @programisli
      @programisli  2 года назад

      На канале видеоуроки более свежие версии подобных видео ruclips.net/channel/UCUNOyHuefhPZdHMebCffljg

  • @pipaleha
    @pipaleha 4 года назад +1

    На самом деле круто обьясняешь! Лайкос

    • @pipaleha
      @pipaleha 4 года назад

      а и пллюс подписка

  • @ansarkaliev5525
    @ansarkaliev5525 2 года назад +1

    Круто))

  • @alele1408
    @alele1408 2 года назад

    Спасибо, отлично объяснили, пойду проверять на бою и практиковаться))

    • @programisli
      @programisli  2 года назад +1

      Посмотри на новом канале более новую версию этого видео и там вообще по SQL много видео ruclips.net/p/PLSn-RgjO4U6TAVsa9RWcGXrUdFUXM7weE

  • @flame-of-win
    @flame-of-win 2 года назад +1

    Очень интересно смотреть

  • @ivansinelnyk825
    @ivansinelnyk825 3 года назад +1

    Спасибо

  • @OlegOleg-ds3cc
    @OlegOleg-ds3cc 4 года назад +1

    Спасибо!
    P.S.
    Пример был хороший. Информация усвоена))

    • @programisli
      @programisli  4 года назад

      Спасибо за просмотр

  • @KolomiecSergeyK
    @KolomiecSergeyK 3 года назад +2

    Сподобалось. Лайкнув :)

  • @d.skok_off
    @d.skok_off 2 года назад +1

    Спасибо, очень полезное видео.

    • @programisli
      @programisli  2 года назад

      На втором канале есть много по SQL, в том числе и перезапись этого видео в чуть более подробном варианте ruclips.net/p/PLSn-RgjO4U6TAVsa9RWcGXrUdFUXM7weE

  • @ihorprytula9514
    @ihorprytula9514 4 года назад +1

    Спасибо! Очень полезно и интересно

    • @programisli
      @programisli  4 года назад

      Спасибо, старался

  • @nudyk
    @nudyk 7 месяцев назад +1

    Урок вроде простой но как дорого этот опыт дается, сколько времини ушло что бы до всего этого дайти самому. Новичкам я тоже обьясняю что индекс это по сути таблица где индексовые поля это кластерный примари кей которая хранит так же примари кей основной таблицы и поля которые указаны в инклуде и эту таблицу сиквел сервер джойнит неявно. И вся мощь реляционной базы данных как раз заключается в использовании индексов. Тогда становится понятно когда они нужны

    • @programisli
      @programisli  7 месяцев назад +1

      Это старое видео. На другом канале у меня много теоретических видосов по базам ruclips.net/video/BPr1ZBEJ4lc/видео.html
      И именно про индексы я говорил тут ruclips.net/video/vrnAkrH_Vts/видео.html там есть ещё видосы про оптимизацию, более свежие.

  • @reflex5989
    @reflex5989 28 дней назад

    Мне очень нравится музыка у вас в видео, подскажите есть на какой-то площадке ваш плей лист?

    • @programisli
      @programisli  28 дней назад

      Я уже не помню, где это я взял.

  • @wobserver
    @wobserver 5 лет назад +1

    Причина скана - невозможно без потерь преобразовать nchar в char. Поэтому SQL делает cast(index_fld as nchar) и естественно мы получили скан индекса.

    • @programisli
      @programisli  5 лет назад

      Эта проблема будет если поле содержит varchar, а поиск происходит по nvarchar. Вот тут уже печалька, нужно действительно вытаскивать каждое значение поля и превращать хранимые в базе данных значения в nvarchar и сравнивать, потому что иначе без потерь не обойтись.
      Если мне не иизменяет память, в примере было наоборот - поле в nvarchar, а поиск ведется по параметру varchar. Так вот параметр можно без потерь превратить в nvarchar, а потом использовать индекс, но SQL Server этого не делает.

    • @wobserver
      @wobserver 5 лет назад +1

      В видео именно база маде ин юс, с Чаром и орм которая нчар в параметр передавала.

  • @HowItWorks
    @HowItWorks 5 лет назад

    С переменными в запросах вообще может быть всё плохо. Я уже давненько с БД не работал плотно, но если не изменяет память, в общих чертах, из-за переменных зачастую оптимизатору сложно построить правильный план запроса. Не знает что может придти в переменной (какие данные) и каково их распределение (физическое) в табличке. По этому может запросто уходить в полное сканирование.

  • @KastorDriver
    @KastorDriver 5 лет назад +2

    С телефона некомфортно смотреть. Было бы хорошо в presentation mode показывать код т.к. информация отображается мелким шрифтом на 1/5 всей площади экрана.

    • @programisli
      @programisli  5 лет назад +1

      Надо будет в следующий раз в Management Studio увеличить шрифт

    • @user-bc8pr5up2r
      @user-bc8pr5up2r 5 лет назад

      +1

  • @HowItWorks
    @HowItWorks 5 лет назад

    8:00 ну да, оптимизатор запросов может решить, что фулскан дешевле. Принимает решение на основе статистики и тех условий, что задают.

  • @xBesss
    @xBesss 5 лет назад +1

    Посоветуйте хорошую книгу по SQL. Обычно использую ОРМ для работы с базой, но вот в глубоком понимании баз, есть пробел

    • @programisli
      @programisli  5 лет назад +1

      Больша часть моей книги по Transact-SQL доступна бесплатно www.flenov.info/books/read/transact-sql. Ее можно купить и в электронном виде на litres кажется

  • @DJGlock
    @DJGlock 5 лет назад +1

    Спасибо, интересно. 7 лет работал с Ораклом, а в ближайшее время придется столкнуться с MS SQL Server на новом месте. Удивлен тому, что индекс хранит значение индексируемого поля И primary key. В Оракле, например, хранится значение + rowID (уникальный идентификатор записи в БД).
    А нельзя ли план запроса отображать как в оракле (в табличном виде)? i.stack.imgur.com/SsRfZ.png Гуглил немного, не понял, можно ли. А то для больших запросов удобнее табличный вид, на мой взгляд. Хотя, возможно, это лишь привычка.
    Еще было бы здорово рассказать про партиционирование (секционирование) таблиц, плюсы и минусы. А так же про индексы в секционированных таблицах.
    Так же стоит рассказать больше про уникальные/неуникальные индексы. А так же про составные индексы, как правильно по ним искать. Например если индекс по полям A, B, C, то запрос, в котором есть только условие, например, на B и C, не будет работать эффективно, т.к. упущено первое поле индекса. В оракле, например, это будет либо index skip scan, либо игнор индекса.
    Ну и про хинты стоит рассказать, их опасность, вред и польза.
    Вообще, если есть цель больше рассказать про оптимизацию, мне кажется стоило бы провести ликбез об индексах в общем, о методах доступа к данным, логические чтения из буфера/ физические чтения с диска (как я понимаю принципы те же, что и у оракла). Про полный скан таблицы, полный скан индекса, в чем отличие принципиальное. В данном видео это лишь косвенно затронуто - разница между index scan и index seek. Про случаи, когда полный скан таблицы может быть выгоднее, чем поиск по индексу (когда надо много данных выбрать). Про статистику и как она влияет на выполнение запросов. И много еще чего.
    В общем тут можно много чего рассказывать. :)

    • @programisli
      @programisli  5 лет назад +2

      Если быть точнее, кажется кластерный индекс хранится, просто это обычно первичный ключ. Кластерный индекс - это тот, по которому физически строки расположены на диске. Это пока введение, будет дальше более углубленная информация

    • @DJGlock
      @DJGlock 5 лет назад

      @@programisli ясно. Ну вот по поводу введения, как мне кажется, можно (и нужно) чуть более обобщенную информацию дать, чтобы людям было понятно, почему тот или иной подход работает быстрее. Ну или дать ссылки на общую информацию по СУБД.

    • @programisli
      @programisli  5 лет назад +1

      Дополнительную информацию можно найти здесь www.flenov.info/books/read/transact-sql

  • @Dmitrii.Liseev
    @Dmitrii.Liseev 2 года назад +1

    Только что проверил на SQL Server 2019. Сервер сам выполняет преобразование переменной и потом Index Seek.

    • @programisli
      @programisli  2 года назад

      Надо проверить 19

    • @Dmitrii.Liseev
      @Dmitrii.Liseev 2 года назад

      @@programisli там прямо в плане запроса видно скалярную операцию преобразования типа.

  • @puga1o
    @puga1o 5 лет назад

    Добрый день! Прошу прощения что комментарий не в тему) но все же хочу спросить у Вас совета,есть ли смысл учиться на Веб разработчика из-за очень хорошей заработной платы(в этом моя мотивация) или же все таки нужно обязательно любить это дело и никак иначе? Благодарю заранее!

    • @programisli
      @programisli  5 лет назад

      Конечно стоит, пока еще нет серьезной замены Web. Мобильные немного отвоевали, но Web все еще очень перспективный

  • @user-cm6jg8vu2g
    @user-cm6jg8vu2g 4 года назад +1

    а будет разница в производительности, если агрегатную функцию добавить в переменную, а не в селект?

    • @programisli
      @programisli  4 года назад

      Что ты имеешь ввиду? Пришли мне пример www.flenov.info/page/contactme

    • @user-cm6jg8vu2g
      @user-cm6jg8vu2g 4 года назад

      @@programisli ответил

  • @user-bu3kr8vb9r
    @user-bu3kr8vb9r 5 лет назад

    Спасибо, все было понятно! Я сделала индекс для простого запроса, который обращается к одной таблице: CREATE INDEX IX_RABOTNIKK_TrudoemkostK_City ON RABOTNIKK (
    TrudoemkostK, City
    )
    .
    Но не могу понять, как сделать индекс для запроса, который обращается к 3-м таблицам? Вот как я начала:
    CREATE INDEX IX_RABOTNIKK on RABOTNIKK[first_name], RABOTNIKK[first_name], ProektK[Trudoemkost] (
    first_name, last_name, Trudoemkost
    )

    • @programisli
      @programisli  5 лет назад

      Индексы создаются на одну таблицу. Просто создай три индекса

    • @user-bu3kr8vb9r
      @user-bu3kr8vb9r 5 лет назад

      @@programisli
      Спасибо большое за ответ)) я как написала этот вопрос, то сразу сама сообразила:)
      Спасибо вам большое!))

  • @maksimbondarenko1179
    @maksimbondarenko1179 4 года назад +1

    Утверждение, что seek всегда работает быстрее, чем scan в корне неверно.

    • @programisli
      @programisli  4 года назад

      Разве я сказал всегда? Если да,, то моя ошибка, зависит от данных. Возможно говорил относительно определенного запроса. О какой секунде идёт речь?

  • @HowItWorks
    @HowItWorks 5 лет назад +1

    6:30 индекс покрывающий запрос. По этому за запросы с звёздочками надо бить по рукам.

  • @user-bc8pr5up2r
    @user-bc8pr5up2r 5 лет назад +2

    продам первый комент

  • @SergeiCherkai
    @SergeiCherkai 4 года назад +2

    Ну хоть кто-то поставит диз ? ))))

    • @programisli
      @programisli  4 года назад +1

      Редко такое бывает, но без дизлайков иногда обходится. Может удалось записать полезно и интересно?

  • @user-nd1qc7ir9x
    @user-nd1qc7ir9x 2 года назад

    я так ничего и не понял... херовый с тебя объясняльщик

    • @programisli
      @programisli  2 года назад

      спасибо за отзыв