I nic o funkcjach. Dlaczego w aktualnym planie brakuje informacji o funkcji?
Jest to zgodne z projektem, ze względu na wydajność.
Funkcje zawierające BEGIN
iw END
definicji tworzą nową ramkę stosu T-SQL dla każdego wiersza wejściowego. Innymi słowy, treść funkcji jest wykonywana osobno dla każdego wiersza wejściowego . Ten pojedynczy fakt wyjaśnia większość problemów związanych z wydajnością związanych ze skalarnymi funkcjami T-SQL i funkcjami składającymi się z wielu instrukcji (należy zauważyć, że wbudowane funkcje cenione w tabeli nie używają BEGIN...END
składni).
W kontekście twojego pytania spowodowałoby to pełne SHOWPLAN
wyjście dla każdego wiersza. Dane wyjściowe planu XML są dość szczegółowe i kosztowne w produkcji, więc generowanie pełnego wyniku dla każdego wiersza byłoby złym pomysłem.
Przykład
Rozważ poniższą funkcję skalarną T-SQL, utworzoną w przykładowej bazie danych AdventureWorks , która zwraca nazwę produktu na podstawie jego identyfikatora:
CREATE FUNCTION dbo.DumbNameLookup
(
@ProductID integer
)
RETURNS dbo.Name
AS
BEGIN
RETURN
(
SELECT
p.Name
FROM Production.Product AS p
WHERE
p.ProductID = @ProductID
);
END;
Plan przedrealizacyjny
Plan wstępnego wykonania (plan szacowany w SSMS) pokazuje informacje o planie dla instrukcji nadrzędnej i zagnieżdżonych wywołań funkcji:
-- Pre-execution plan shows main query and nested function call
SET SHOWPLAN_XML ON;
GO
SELECT dbo.DumbNameLookup(1);
GO
SET SHOWPLAN_XML OFF;
Wyjście SSMS:
Ten sam kod XML wyświetlany w Eksploratorze planów SQL Sentry wyraźnie pokazuje zagnieżdżoną naturę wywołań:
Wyjście po wykonaniu
SSMS pokazuje szczegóły tylko dla głównego zapytania, gdy wymagane jest wyjście planu po wykonaniu:
-- Post-execution plan shows main query only
SET STATISTICS XML ON;
SELECT dbo.DumbNameLookup(1);
SET STATISTICS XML OFF;
Wpływ działania na działanie w inny sposób można pokazać za pomocą klasy zdarzeń Showplan XML Statistics Profile w SQL Server Profiler, używając zapytania, które wywołuje funkcję wiele razy (raz na wiersz wejściowy):
SELECT TOP (5)
p.ProductID,
dbo.DumbNameLookup(p.ProductID)
FROM Production.Product AS p;
Dane wyjściowe profilera:
Istnieje pięć osobnych planów po wykonaniu dla wykonywania funkcji i jeden dla zapytania nadrzędnego. Pięć planów funkcji wygląda tak w dolnym okienku profilera:
Nadrzędny plan zapytań to:
Wykonanie zapytania bez TOP (5)
klauzuli skutkuje pełnym planem wykonania dla każdego z 504 wierszy w tabeli Produkt. Prawdopodobnie zobaczysz, jak to szybko wymknie się spod kontroli przy większych stołach.
Sytuacja wyzwalaczy jest odwrotna. Nie zawierają one żadnych informacji o planie przed wykonaniem, ale zawierają plan po wykonaniu. Odzwierciedla to charakter wyzwalaczy oparty na zestawie; każdy jest uruchamiany raz dla wszystkich wierszy, których dotyczy problem, a nie raz dla każdego wiersza.