Винаги се препоръчва при писане на заявки или код на база данни на SQL Server (процедури и изгледи) да се обърне внимание на плана за изпълнение. Има няколко причини за това. Първо – оптимизаторът може да избира план, който не очаквате. Например, индексно сканиране на голяма таблица преди съпоставяне с по-малка таблица. Второ – трябва да се вземе предвид как ще се представя тази заявка след месеци или години, ако заявките се изпълняват в нова система с малки таблици, които ще се разрастват. И накрая, но най-важното, колко бърза е тази заявка и колко ресурси използва. Последната точка може да не изглежда толкова важна, може би си мислите, стига да отнема по-малко от 3 секунди, което е достатъчно добре, но ако може да работи за <1 секунда, няма ли да е по-добре? Ако вашите бази данни се хостват в облак, намаляването на ресурсите може също да ви спести пари.
Много случаи за оптимизация на SQL обикновено идват от проблем, който е открит от крайния потребител или вашия софтуер за наблюдение. „Защо генерирането на този отчет отнема 30 минути?“, „Какво причинява този скок в I/O чакането“ или „Защо тези задания отнемат два пъти повече време, отколкото миналата година?“
Във всички тези сценарии все пак се свежда до известни познания за плановете за изпълнение и най-добрия начин да се коригира SQL, за да се подобри ситуацията, а това може да отнеме много време и не винаги успешно.
Да вземем пример. И така, вие пишете нова заявка, изпълнявате я и след това си мислите, скъпи, това отнема твърде много време.
17 секунди за 730 реда, какво трябва да направя?
Първо, нека прегледаме плана за изпълнение:
Това не винаги е лесно, ако трябва да увеличавате и намалявате, за да го осмислите. И така, първият съвет е да получите добър преглед на планове като този с пакета за настройка на Spotlight.
Инструментът за преглед на плановете подчертава ключовите части от информация, от които се нуждаем и къде са основните операции, както и откроява всички предупреждения.
Ето един пример:
И така, има проблем с този код, но какво можем да направим с него?
Е, всъщност доста. Можем да използваме подсказки за заявка, да разгледаме добавянето на някои индекси (не забравяйте, че това може да повлияе на други заявки и DML), добавяне на битове код, които не променят набора от резултати, но влияят на оптимизатора да генерира различен план и малки трикове за спрете оптимизатора предвид конкретен индекс, който използва, и може би генерирайте нов план. Но всичко това е опит и грешка и отнема много време, за да се направи ръчно.
Като добавим приложението Spotlight Extensions към SSMS и се абонираме за Spotlight Tuning Pack, можем да позволим на функцията за оптимизация в Tuning Pack да свърши цялата упорита работа вместо нас.
Може да сте забелязали на първата екранна снимка, че когато функцията е активирана, тя автоматично открива, че е възможна оптимизация:
Щракнете върху Преглед на анализ
След това можете да щракнете върху бутона Оптимизиране и оптимизаторът ще анализира кода и ще започне да прилага правила за пренаписване, които ще променят синтаксиса на SQL, даващи алтернативи, които предоставят същия набор от резултати, и след това да ги тества, за да можем да видим дали има алтернативно изпълнение плановете са по-бързи и защо. Правилата се прилагат в комбинации, така че възможните алтернативи могат да бъдат над 100. Инструментът обаче ви показва само алтернативи, които са по-бързи от оригинала.
Този процес работи на заден план и ви спестява огромно количество време, ако се опитате да направите това ръчно.
И когато се покажат резултатите, можете да сравните алтернативите, да видите разликите в кодовете, да сравните плановете и да прегледате статистиката.
И така, обратно към SSMS с моята нова версия на заявката и я тествайте.
Успех.
Ако това е в среда за разработка, може да помислите за прочистване на буферния кеш с помощта на DBCC DROPCLEANBUFFERS, за да тествате заявките си със студен буферен кеш, без да изключвате и рестартирате сървъра.
Също така, помислете за добавяне на SET STATISTICS IO ON към заявката за повече информация защо синтаксисът на заявката има значение:
Оригинал:
Пренапишете:
И това може да се постигне и в Tuning Pack с функцията за сравнение на статистически данни:
И така, с успешната промяна и щастлив краен потребител, преминете към следващата заявка. Чрез непрекъснато подобряване на производителността на отделните заявки, ние подобряваме производителността на екземпляра.