Плановете за изпълнение на SQL заявка се генерират, когато оптимизаторът на заявки определя най-ефективния начин за доставяне на данните, поискани от заявка. Тези планове са представяне на операциите на базата данни, които заявката изпълнява, като показва кои обекти използва заявката, видовете употреби и как се използват.
Общоизвестно е, че слабо представящите се заявки са ключов индикатор, че нещо не е наред в базата данни. Така че разглеждането „под капака“ на плана за изпълнение на заявка е един от най-добрите начини да се определи причината за проблема с производителността.
Информацията, налична в плана за изпълнение на SQL, е безценна за администраторите на база данни, които отстраняват проблеми с производителността на заявките на SQL Server, тъй като им позволява да стигнат до основната причина за проблема и да настроят заявката според нуждите.
Проучването на плановете за изпълнение на SQL е една от първите стъпки в настройката на производителността, тъй като планът ясно подчертава най-вероятните източници на проблеми в рамките на заявка, включително скъпи оператори, необичаен брой записи, преминаващи между оператори, и допълнителни оператори.
DBA също се възползват от предупреждения за план за изпълнение, които предупреждават потребителите за проблеми като разливане на tempdb и липсващи индекси.
Видове планове за изпълнение на SQL
Има два основни типа планове за изпълнение на SQL:прогнозни планове за изпълнение и действителни планове за оценка.
Очакваните планове за изпълнение се описват най-добре като вид прогноза за времето. Както подсказва името, прогнозните планове за изпълнение използват приблизителни изчисления, статистически данни и други параметри за оценка на стъпките, които могат да бъдат последвани от SQL Server Engine за изпълнение на подадената заявка след синтактичен анализ на заявката.
Не е необходимо да изпълнявате заявката, за да генерирате този тип план за изпълнение, така че е добре за сложни заявки, за които генерирането на действителен план за изпълнение би отнело много време.
Действителните планове за изпълнение изпълняват подадената заявка и след това показват стъпките, възникнали по време на изпълнението. Този тип план показва реални изчисления и действителните (не прогнозирани) стъпки, последвани от SQL Server Engine.
Тъй като този тип план за изпълнение всъщност изпълнява заявката, той е добър избор за отстраняване на проблеми с производителността на заявката.
Как да генерираме план за изпълнение на SQL
Hackernoon предоставя кратко описание как да генерирате прогнозни и действителни планове за изпълнение. Процесът може да се сведе до следните стъпки:
Генерирайте прогнозен план за изпълнение
- Отидете до базата данни
- Откройте заявката
- Щракнете върху „Запитване“
- Щракнете върху „Показване на прогнозния план за изпълнение“ или използвайте прекия път Ctrl + L
Генерирайте действителен план за изпълнение
- Отидете до базата данни
- Откройте заявката
- Щракнете върху „Запитване“
- Щракнете върху „Включване на действителен план за изпълнение“ или използвайте прекия път Ctrl + M
Ще намерите подробно обяснение как да генерирате прогнозни планове за изпълнение и действителни планове за изпълнение в официалната документация на Microsoft.
Защо прогнозните и действителните планове за изпълнение на SQL може да се различават
Като цяло прогнозните и действителните планове за изпълнение ще бъдат сходни. Има обаче случаи, когато те са различни. Това е нормално и се случва, защото статистиката на базата данни и действителните данни са различни. Тези разлики могат да бъдат въведени по няколко канала:
Паралелизъм
Цената на плана може да доведе до създаване на два плана за изпълнение за подадена заявка. SQL Server Engine ще избере дали да използва или не паралелния план, така че е възможно единият план да използва паралелния план, а другият да използва серийния план.
Застояли статистически данни
Когато вмъквате данни в и изтривате данни от таблици и индекси или променяте таблицата или индексната схема, статистиката ще се промени. Ако статистическите данни не се актуализират редовно, действителният план за изпълнение ще бъде различен от прогнозния план за изпълнение.
Невалиден прогнозен план
Ако заявка съдържа израз, който изисква временна таблица, която съществува само ако заявката е изпълнена, генерирането на прогнозен план за изпълнение ще създаде грешка, тъй като не е била изпълнена заявка. Същата заявка ще работи добре в действителния план за изпълнение, тъй като заявката е изпълнена.
Плановете за изпълнение на SQL са ценен ресурс за отстраняване на проблеми с производителността на SQL Server. Знанието как да генерирате както прогнозни, така и действителни планове за изпълнение на SQL е основен инструмент за всеки DBA, натоварен с настройване на заявки за оптимална производителност.