Database
 sql >> база данни >  >> RDS >> Database

Подобрения на Showplan за UDFs

Microsoft подобрява съдържанието на изхода ShowplanXML за SQL Server през последните няколко издания и в SQL Server 2017 CU3 те въведоха статистика за изпълнение на дефинирана от потребителя функция (UDF) в възела QueryTimeStats на XML изхода. Това също беше обратно пренесено към SQL Server 2016 в Service Pack 2 за действителни планове за изпълнение. Тази функция ви позволява да разберете окончателно въздействието на скаларното изпълнение на UDF като част от характеристиките на производителността на заявка. Въпреки това, има интересен улов, свързан с използването на тази функция; трябва да съберете действителния план за изпълнение, като използвате актуална версия на SQL Server Management Studio или като използвате SentryOne Plan Explorer, или информацията ще бъде премахната от плана за изпълнение.

Сравняване на планове в различни версии на SSMS

Наскоро представих сесия на потребителска група в Чикаго за настройка на производителността на заявки с помощта на кеша на плана и по време на сесията използвах най-новата версия на SQL Server Management Studio по това време, версия 17.5. По това време също така наскоро актуализирах моята VM до SQL Server 2016 Service Pack 2, така че демонстрирах новата информация за UdfElapsedTime и UdfCpuTime в действителния план за показване QueryTimeStats и направих бележка за себе си, за да напиша статия за thm. Когато се върнах, за да започна всъщност тази статия, използвайки точно същата заявка на точно същата VM, не можах да генерирам действителен план за изпълнение, който съдържа информацията UdfElapsedTime или UdfCpuTime въпреки многократните опити. Не можах да разбера какво правя нередно и се оказа, че коренът на проблема е, че случайно стартирах SQL Server Management Studio 2016 вместо SQL Server Management Studio 17.5. Когато изпълних същата заявка в SSMS 17.5, изведнъж получих обратно информацията UdfElapsedTime и UdfCpuTime. Вижте по-долу за примери за XML, върнат от двете версии на SSMS:

Showplan XML от SSMS 17.5

Showplan XML от SSMS 2016 г. – WaitStats и QueryTimeStats са напълно премахнати

Използвах Microsoft Message Analyzer, за да създам TCP проследяване на мрежовия трафик на порт 1433 между клиент, изпълняващ SSMS 2016 срещу екземпляр на SQL Server 2016 SP2, за да уловя TDS пакетите, изпращани от сървъра към клиента. Това разкрива, че ShowPlanXML, върнат от сървъра, включва информацията за QueryTimeStats, въпреки че не се появява в ShowPlanXML в SSMS 2016, така че клиентът всъщност премахва всички полета, които не са включени в дефиницията на схемата, която се доставя с клиента.

Отместване на съобщението:1635
<.Q.u.e.r.y.T.i.m.e.S.t.a.t.s. .E.l.a.p.s.e.d.T.i.m.e.=.".2.6.7.". .C.p.u.T.i.m.e.=.".2.6.7.". .U.d.f.E.l.a.p.s.e.d.T.i.m.e.=.".2.1.5.". .U.d.f.C.p.u.T.i.m.e.=.".2.1.5.".>.<./.Q.u.e.r.y.T.i.m.e.S.t.a.t.s.>

Това е нещо, за което трябва да внимавате с .sqlplan файлове, които се генерират с помощта на по-стари клиентски версии на SSMS и/или планове за изпълнение, които са запазени или копирани от по-стара версия на SSMS, което често се случва, когато работя с клиенти от електронна поща.

В SSMS разглеждането на графичния план за изпълнение не ви дава никаква индикация за въздействието върху производителността на изпълнението на скаларната дефинирана от потребителя функция в заявката:

Ако базираме нашия анализ на производителността стриктно върху разходите на всеки оператор, Compute Scalar за изпълнение на функцията не изглежда значително влияние върху производителността. Съветите за инструменти за операторите също не материализират информацията или не съдържат никакви предупреждения относно въздействието на дефинираната от потребителя функция. Единственото място, където виждаме тази информация в SSMS в момента е в XML на плана или в прозореца Properties за основния оператор SELECT на плана, както е показано по-долу:

Използвайки информацията тук обаче, можем да видим, че UdfCpuTime е 85,79% от общото CpuTime, а UdfElapsedTime е 64,44% от общото ElapsedTime за изпълнение на заявката (изчисляване на процентите с помощта на QueryTimeStats CpuTime и UdfCpued в синьо по-горе) и ElapsedTime и UdfElapsedTime).

Използване на SentryOne Plan Explorer за извличане на планове

Един от любимите ми безплатни инструменти за подпомагане на настройката на производителността на SQL Server е SentryOne Plan Explorer, а една от характеристиките на Plan Explorer от дълго време е възможността да генерира действителен план за изпълнение чрез поставяне на командния текст в нов прозорец и щракнете върху бутона Получаване на действителен план, както е показано по-долу.

Тъй като Plan Explorer чете ShowplanXML, както е предоставен от двигателя на SQL Server, той също ще съдържа разширената информация в QueryTimeStats. Ако обаче отворите план за изпълнение, който е запазен от по-стара версия на Management Studio, или ако използвате добавката на Plan Explorer за SSMS в по-стара версия, за да видите плана в Plan Explorer, тогава подобрената информация няма да бъде показана.

Решетката с изявления на раздела Резултати в Plan Explorer може да се актуализира с помощта на Column Chooser, за да добавите колоните за продължителност на UDF и UDF CPU заедно със съществуващите колони в мрежата, което улеснява да се види къде оказва влияние изпълнението на дефинираната от потребителя функция за големи партиди с няколко изявления. Plan Explorer също така осигурява подчертаване на тези колони, когато те представляват значителна част от общия процесор и/или продължителност, както е показано по-долу.

Информацията за диаграмата на плана в Plan Explorer също е подобрена. Ето диаграмите, използващи Разходи по CPU + I/O и след това Разходи по CPU:

Планирайте диаграма с използване на разходи чрез CPU + I/O

Планирайте диаграма с използване на разходи от процесора

Има допълнителни предупреждения в основния оператор SELECT, когато статистическите данни за изпълнение на дефинирани от потребителя функции показват, че те представляват значителна част от общия процесор и/или общата продължителност:

Подсказка за основния оператор SELECT

Операторът Compute Scalar също има предупреждение в Plan Explorer въз основа на броя на редовете, които се обработват от операцията, дори за планове, които не включват подобренията за ShowplanXML:

Подсказка за изчисляване Скаларен оператор

Показването на разходите по CPU може да помогне за идентифициране на оператори със скрити разходи за CPU, които могат да бъдат заглушени от I/O. Тази способност за леко изместване на изгледа за отстраняване на неизправности или на процесора, или на I/O самостоятелно е един от многото разлики между Plan Explorer и SSMS. Ето контекстното меню на диаграмата, където можете да промените този изглед:

Заключение

Подобренията на Showplan XML в SQL Server правят много по-лесно определянето на цялостното въздействие на скаларните дефинирани от потребителя функции върху производителността на заявките в SQL Server 2016 Service Pack 2 и SQL Server 2017 Кумулативна актуализация 3, стига да използвате повече последна версия на клиентските инструменти или Plan Explorer за извличане на плана за изпълнение.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Как да направите номера на етажи в SQL

  2. 9 най-добри практики за писане на SQL заявки

  3. Създаване на по-усъвършенстван модел със статуси на потребител, нишка и публикация

  4. SQL DROP COLUMN за начинаещи

  5. Ръководство за функциите на PubNub