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

Как да получа план за изпълнение на заявка в SQL Server?

Има редица методи за получаване на план за изпълнение, кой от които да използвате ще зависи от вашите обстоятелства. Обикновено можете да използвате SQL Server Management Studio, за да получите план, но ако по някаква причина не можете да изпълните заявката си в SQL Server Management Studio, тогава може да ви е полезно да можете да получите план чрез SQL Server Profiler или чрез проверка кеша на плана.

Метод 1 – Използване на SQL Server Management Studio

SQL Server се предлага с няколко чисти функции, които правят много лесно заснемането на план за изпълнение, просто се уверете, че елементът от менюто „Включи действителен план за изпълнение“ (намерен под менюто „Запитване“) е отметнат и изпълнете заявката си както обикновено .

Ако се опитвате да получите плана за изпълнение на изрази в съхранена процедура, тогава трябва да изпълните съхранената процедура, както следва:

exec p_Example 42

Когато заявката ви завърши, трябва да видите допълнителен раздел, озаглавен "План за изпълнение", да се появи в панела с резултати. Ако сте изпълнили много изявления, може да видите много планове, показани в този раздел.

От тук можете да прегледате плана за изпълнение в SQL Server Management Studio или да щракнете с десния бутон върху плана и да изберете „Запазване на плана за изпълнение като...“, за да запишете плана във файл във формат XML.

Метод 2 – Използване на опции SHOWPLAN

Този метод е много подобен на метод 1 (всъщност това е, което SQL Server Management Studio прави вътрешно), но го включих за пълнота или ако не разполагате с SQL Server Management Studio.

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

SET SHOWPLAN_TEXT ON
SET SHOWPLAN_ALL ON
SET SHOWPLAN_XML ON
SET STATISTICS PROFILE ON
SET STATISTICS XML ON -- The is the recommended option to use

Това са опции за връзка и затова трябва да стартирате това само веднъж на връзка. От този момент нататък всички изпълнени изявления ще бъдат придружени от допълнителен набор от резултати съдържащи вашия план за изпълнение в желания формат - просто изпълнете заявката си, както обикновено, за да видите плана.

След като сте готови, можете да изключите тази опция със следното изявление:

SET <<option>> OFF

Сравнение на форматите на планове за изпълнение

Освен ако нямате силно предпочитание, моята препоръка е да използвате STATISTICS XML опция. Тази опция е еквивалентна на опцията „Включване на действителен план за изпълнение“ в SQL Server Management Studio и предоставя най-много информация в най-удобния формат.

  • SHOWPLAN_TEXT - Показва основен текстов план за изпълнение, без да се изпълнява заявката
  • SHOWPLAN_ALL - Показва базиран на текст прогнозен план за изпълнение с оценки на разходите, без да се изпълнява заявката
  • SHOWPLAN_XML - Показва базиран на XML прогнозен план за изпълнение с оценки на разходите, без да се изпълнява заявката. Това е еквивалентно на опцията „Показване на прогнозния план за изпълнение...“ в SQL Server Management Studio.
  • STATISTICS PROFILE - Изпълнява заявката и показва действителен план за изпълнение, базиран на текст.
  • STATISTICS XML - Изпълнява заявката и показва действителен план за изпълнение, базиран на XML. Това е еквивалентно на опцията „Включване на действителен план за изпълнение“ в SQL Server Management Studio.

Метод 3 – Използване на SQL Server Profiler

Ако не можете да изпълните заявката си директно (или вашата заявка не се изпълнява бавно, когато я изпълните директно - не забравяйте, че искаме план на заявката да се представя лошо), тогава можете да заснемете план с помощта на проследяване на SQL Server Profiler. Идеята е да изпълните заявката си, докато се изпълнява проследяване, което улавя едно от събитията „Showplan“.

Имайте предвид, че в зависимост от натоварването виеможете използвайте този метод в производствена среда, но очевидно трябва да внимавате. Механизмите за профилиране на SQL Server са проектирани да минимизират въздействието върху базата данни, но това не означава, че няма да има някакви въздействие върху производителността. Може също да имате проблеми с филтрирането и идентифицирането на правилния план във вашата трасировка, ако вашата база данни се използва интензивно. Очевидно трябва да се консултирате с вашия DBA, за да видите дали са доволни от това, че правите това в тяхната ценна база данни!

  1. Отворете SQL Server Profiler и създайте нова трасировка, свързваща се с желаната база данни, срещу която искате да запишете проследяването.
  2. В раздела „Избор на събития“ отметнете „Показване на всички събития“, проверете реда „Ефективност“ -> „Показване на XML“ и стартирайте проследяването.
  3. Докато трасирането се изпълнява, направете каквото е необходимо, за да стартирате бавно изпълняващата се заявка.
  4. Изчакайте заявката да завърши и спрете проследяването.
  5. За да запазите проследяването, щракнете с десния бутон върху xml плана в SQL Server Profiler и изберете „Извличане на данни за събитие...“, за да запишете плана във файл във формат XML.

Планът, който получавате, е еквивалентен на опцията „Включи действителен план за изпълнение“ в SQL Server Management Studio.

Метод 4 – Проверка на кеша на заявката

Ако не можете да изпълните заявката си директно и също така не можете да заснемете проследяване на профайлъра, все пак можете да получите приблизителен план, като проверите кеша на плана на SQL заявка.

Ние проверяваме кеша на плана, като отправяме запитвания към DMV на SQL Server. Следва основна заявка, която ще изброи всички кеширани планове за заявка (като xml) заедно с техния SQL текст. В повечето бази данни ще трябва също да добавите допълнителни клаузи за филтриране, за да филтрирате резултатите само до плановете, които ви интересуват.

SELECT UseCounts, Cacheobjtype, Objtype, TEXT, query_plan
FROM sys.dm_exec_cached_plans 
CROSS APPLY sys.dm_exec_sql_text(plan_handle)
CROSS APPLY sys.dm_exec_query_plan(plan_handle)

Изпълнете тази заявка и щракнете върху XML плана, за да отворите плана в нов прозорец – щракнете с десния бутон и изберете „Запазване на плана за изпълнение като...“, за да запишете плана във файл в XML формат.

Бележки:

Тъй като има толкова много фактори (вариращи от схемата на таблицата и индекса до съхранените данни и статистиката на таблицата), трябва винаги опитайте се да получите план за изпълнение от базата данни, която ви интересува (обикновено тази, която изпитва проблем с производителността).

Не можете да заснемете план за изпълнение за криптирани съхранени процедури.

„действителни“ спрямо „приблизителни“ планове за изпълнение

действителен планът за изпълнение е този, при който SQL Server действително изпълнява заявката, докато приблизителен план за изпълнение SQL Server работи какво би направете без да изпълнявате заявката. Въпреки че е логически еквивалентен, действителният план за изпълнение е много по-полезен, тъй като съдържа допълнителни подробности и статистически данни за това какво всъщност се е случило при изпълнение на заявката. Това е от съществено значение при диагностициране на проблеми, при които оценките на SQL сървърите са изключени (като например когато статистическите данни са остарели).

  • Прогнозният и действителният план за изпълнение е преразгледан

Как да тълкувам план за изпълнение на заявка?

Това е тема, достатъчно достойна за (безплатна) книга сама по себе си.

Вижте също:

  • Основни положения на плана за изпълнение
  • Разрешение на SHOWPLAN и пакети Transact-SQL
  • SQL Server 2008 – Използване на хешове на заявка и хешове на план на заявка
  • Анализиране на кеша на плана на SQL Server


  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 в SQL Server

  2. Как да върнете само датата от тип данни на SQL Server DateTime

  3. Вземете всички дати между две дати в SQL Server

  4. Как да използвам GROUP BY за конкатенация на низове в SQL Server?

  5. Тригер за актуализиране на SQL Server, Получавайте само променени полета