Чи переглядає програма SentryOne Plan Explorer читання в UDF?


9

У мене такий запит:

select dbo.fn_complexFunction(t.id)
from mytable t

У Провіднику плану SQL SQL я помітив, що я повинен запустити Отримати план оцінки, щоб план запитів включав UDF.

Під час запуску "Отримати фактичний план" не здається, що логічні зчитування та інші показники включають операції, що відбуваються в UDF. У таких випадках, як єдине рішення використовувати Profiler?


1
Наскільки мені відомо, сам механізм запитів не враховує читання в UDF. Це є великою причиною того, що АДС добре уникати, вони непрозорі для оптимізатора.
JNK

Відповіді:


11

Найбільші проблеми, які ми маємо тут:

  1. Як каже @JNK, SQL Server заперечує використання UDF і все одно робить з ними жахливі речі (як завжди оцінює один ряд). Коли ви генеруєте фактичний план у SSMS, ви також не бачите його використання. План Explorer має ті самі обмеження, оскільки він може надавати лише інформацію про план, який надає SQL Server.
  2. Код спирається на різні джерела для метрики виконання під час створення фактичного плану. На жаль, план XML не включає виклики функцій, а SQL Server не виявляє вводу-виводу, який виникає функцією при використанні SET STATISTICS IO ON;будь-якого (саме так Table I/Oвкладка заповнюється).

Розглянемо поданий вигляд та функцію щодо AdventureWorks2012. Це просто нерозумна спроба повернути випадковий рядок із таблиці деталей з випадковим рядком із таблиці заголовків - переважно для того, щоб ми кожен раз генерували якомога більше вводу-виводу.

CREATE VIEW dbo.myview 
WITH SCHEMABINDING
AS
  SELECT TOP (100000) rowguid, SalesOrderID, n = NEWID() 
    FROM Sales.SalesOrderDetail ORDER BY NEWID();
GO

CREATE FUNCTION dbo.whatever(@SalesOrderID INT)
RETURNS UNIQUEIDENTIFIER
WITH SCHEMABINDING
AS
BEGIN
  RETURN 
  (
    SELECT TOP (1) rowguid FROM dbo.myview 
     WHERE SalesOrderID = @SalesOrderID ORDER BY n
  );
END
GO

Що студія управління (чи ні) робить вам

Візьміть такий запит у SSMS:

SET STATISTICS IO ON;

  SELECT TOP (5) SalesOrderID, dbo.whatever(SalesOrderID) 
    FROM Sales.SalesOrderHeader ORDER BY NEWID();

SET STATISTICS IO OFF;

Коли ви оцінюєте план, ви отримаєте план запиту і в одному плані для функції (не 5, як ви могли б сподіватися):

Приблизний план в студії менеджменту

Ви взагалі не отримуєте жодних даних вводу-виводу, очевидно, оскільки запит насправді не виконувався. Тепер генеруйте фактичний план. Ви отримуєте 5 рядків, які ви очікували в сітці результатів, наступного плану (який абсолютно не помітно згадує про UDF, за винятком XML, ви можете знайти його як частину тексту запиту та як частина скалярного оператора):

Фактичний план в студії менеджменту

І наступний STATISTICS IOвихід (який абсолютно не згадується Sales.SalesOrderDetail, навіть якщо ми знаємо, що його потрібно було прочитати з цієї таблиці):

Таблиця "SalesOrderHeader". Кількість сканувань 1, логічне зчитування 57, фізичне зчитування 0, зчитування вперед-зчитування 0, логічне зчитування лобі 0, лобічне фізичне зчитування 0, лобічне зчитування попереднє зчитування 0.

Що розповідає вам Провідник плану

Коли PE генерує орієнтовний план для того ж запиту, він знає про те саме, що і SSMS. Однак він показує речі дещо інтуїтивніше. Наприклад, передбачуваний план зовнішнього запиту показує, як результат функції поєднується з результатами запиту, і в межах однієї схеми плану відразу зрозуміло, що в обох таблицях є введення / виведення :

Приблизний план у Провіднику плану

Він також показує план функції сам по собі , який я включаю лише для повноти:

Розрахунковий план UDF в Провіднику плану

Тепер давайте подивимось на власне план, який у тисячі разів корисніший. Мінус тут, знову ж таки, у ньому є лише інформація, яку SQL Server вирішує показати, тому він може розкрити лише графічні схеми (схеми), які надає SQL Server. Це не ситуація, коли хтось вирішив не показати вам щось корисне; він просто нічого не знає про це, грунтуючись на наданому плані XML. У цьому випадку це подібно до SSMS, ви можете бачити лише план зовнішнього запиту, і це як би функція взагалі не викликається :

Фактичний план у Провіднику плану

Вкладка вводу / виводу Таблиця також все ще покладається на вихідSTATISTICS IO , який також ігнорує будь-яку діяльність, що виконується у виклику функції:

Таблиця вводу-виводу для фактичного плану в Провіднику плану

Однак PE отримує весь стек викликів для вас. Я час від часу чую, як люди запитують: "Pffft, коли мені коли-небудь знадобиться стек викликів?" Ну, ви можете фактично розділити витрачений час, використаний процесор та кількість прочитаних даних (а також для TVF, кількість вироблених рядків) для кожного виклику функції :

Стек викликів у Провіднику плану, показує дзвінки UDF

На жаль, у вас немає можливості співвіднести це повернення до тієї таблиці (ів), звідки походить введення / виведення (знову ж таки тому, що SQL Server не надає цю інформацію), і це не позначено назвою UDF (оскільки він відображається як спеціальний оператор, а не сам виклик функції). Але те, що він дозволяє вам бачити, що студія управління не робить, це собака вашого АДС. Вам все одно доведеться приєднатися до деяких крапок, але крапки є менше, і вони ближче один до одного.

Про Profiler

Нарешті, я настійно рекомендую триматися подалі від Profiler, якщо тільки це не встановити слід на стороні сервера, який ви збираєтеся до сценарію, а потім не запускати рамки будь-якого інструменту інтерфейсу. Використання Profiler проти виробничої системи майже напевно спричинить більше проблем, ніж коли-небудь вирішить . Якщо ви хочете отримати цю інформацію, будь ласка, використовуйте трасування на стороні сервера або розширені події, і обов'язково фільтруйте дуже розумно. Навіть без профілера слід може вплинути на ваш сервер, і пошук показових планів через розширені події - теж не найефективніша річ у світі .


Ах, я не знав про стек викликів у Pro версії. Саме це я і шукав. Добре знати, що існує. На даний момент я не думаю, що я можу виправдати ціну, але буду пам'ятати про це для майбутніх ситуацій. Чи є причина, чому SQL Server не надає інформацію вводу-виводу для UDF в IO STATISTICS? Опускати таку важливу інформацію оманливо.
Гейб

3
@Gabe Я не знаю причини, вибачте. Може, зробити консультацію більш вигідною?
Аарон Бертран

1
@gabe тепер планувач Explorer повністю безкоштовний .. його називається дозорний, який має всі про + кінцеві можливості видання - все безкоштовно.
Кін Шах
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.