Найбільші проблеми, які ми маємо тут:
- Як каже @JNK, SQL Server заперечує використання UDF і все одно робить з ними жахливі речі (як завжди оцінює один ряд). Коли ви генеруєте фактичний план у SSMS, ви також не бачите його використання. План Explorer має ті самі обмеження, оскільки він може надавати лише інформацію про план, який надає SQL Server.
- Код спирається на різні джерела для метрики виконання під час створення фактичного плану. На жаль, план 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. Однак він показує речі дещо інтуїтивніше. Наприклад, передбачуваний план зовнішнього запиту показує, як результат функції поєднується з результатами запиту, і в межах однієї схеми плану відразу зрозуміло, що в обох таблицях є введення / виведення :
Він також показує план функції сам по собі , який я включаю лише для повноти:
Тепер давайте подивимось на власне план, який у тисячі разів корисніший. Мінус тут, знову ж таки, у ньому є лише інформація, яку SQL Server вирішує показати, тому він може розкрити лише графічні схеми (схеми), які надає SQL Server. Це не ситуація, коли хтось вирішив не показати вам щось корисне; він просто нічого не знає про це, грунтуючись на наданому плані XML. У цьому випадку це подібно до SSMS, ви можете бачити лише план зовнішнього запиту, і це як би функція взагалі не викликається :
Вкладка вводу / виводу Таблиця також все ще покладається на вихідSTATISTICS IO
, який також ігнорує будь-яку діяльність, що виконується у виклику функції:
Однак PE отримує весь стек викликів для вас. Я час від часу чую, як люди запитують: "Pffft, коли мені коли-небудь знадобиться стек викликів?" Ну, ви можете фактично розділити витрачений час, використаний процесор та кількість прочитаних даних (а також для TVF, кількість вироблених рядків) для кожного виклику функції :
На жаль, у вас немає можливості співвіднести це повернення до тієї таблиці (ів), звідки походить введення / виведення (знову ж таки тому, що SQL Server не надає цю інформацію), і це не позначено назвою UDF (оскільки він відображається як спеціальний оператор, а не сам виклик функції). Але те, що він дозволяє вам бачити, що студія управління не робить, це собака вашого АДС. Вам все одно доведеться приєднатися до деяких крапок, але крапки є менше, і вони ближче один до одного.
Про Profiler
Нарешті, я настійно рекомендую триматися подалі від Profiler, якщо тільки це не встановити слід на стороні сервера, який ви збираєтеся до сценарію, а потім не запускати рамки будь-якого інструменту інтерфейсу. Використання Profiler проти виробничої системи майже напевно спричинить більше проблем, ніж коли-небудь вирішить . Якщо ви хочете отримати цю інформацію, будь ласка, використовуйте трасування на стороні сервера або розширені події, і обов'язково фільтруйте дуже розумно. Навіть без профілера слід може вплинути на ваш сервер, і пошук показових планів через розширені події - теж не найефективніша річ у світі .