Dan tidak ada tentang fungsi. Mengapa informasi fungsi hilang dalam rencana aktual?
Ini dengan desain, untuk alasan kinerja.
Fungsi yang mengandung BEGIN
dan END
dalam definisi membuat bingkai T-SQL stack baru untuk setiap baris input. Dengan kata lain, fungsi tubuh dijalankan secara terpisah untuk setiap baris input . Fakta tunggal ini menjelaskan sebagian besar masalah kinerja yang terkait dengan fungsi skalar dan multi-pernyataan T-SQL (perhatikan bahwa fungsi bernilai tabel in-line tidak menggunakan BEGIN...END
sintaks).
Dalam konteks pertanyaan Anda, ini akan menghasilkan SHOWPLAN
output penuh untuk setiap baris. Output rencana XML cukup bertele-tele dan mahal untuk diproduksi, sehingga menghasilkan output penuh untuk setiap baris akan menjadi ide yang buruk secara umum.
Contoh
Pertimbangkan fungsi skalar T-SQL di bawah ini, dibuat dalam database sampel AdventureWorks , yang mengembalikan nama produk yang diberikan ID-nya:
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;
Rencana pra-eksekusi
Rencana pra-eksekusi (rencana taksiran dalam SSMS) menampilkan informasi paket untuk pernyataan induk dan panggilan fungsi bersarang:
-- Pre-execution plan shows main query and nested function call
SET SHOWPLAN_XML ON;
GO
SELECT dbo.DumbNameLookup(1);
GO
SET SHOWPLAN_XML OFF;
Output SSMS:
XML yang sama dengan yang dilihat di SQL Sentry Plan Explorer menunjukkan sifat panggilan yang lebih jelas:
Output pasca-eksekusi
SSMS menunjukkan detail hanya untuk kueri utama ketika output rencana pasca-eksekusi diminta:
-- Post-execution plan shows main query only
SET STATISTICS XML ON;
SELECT dbo.DumbNameLookup(1);
SET STATISTICS XML OFF;
Dampak kinerja dari melakukan hal lain dapat ditampilkan dengan menggunakan Kelas Peristiwa Profil Statistik Statistik Tampilkan XML di SQL Server Profiler, menggunakan kueri yang memanggil fungsi beberapa kali (satu kali per baris input):
SELECT TOP (5)
p.ProductID,
dbo.DumbNameLookup(p.ProductID)
FROM Production.Product AS p;
Output profiler:
Ada lima rencana pasca-eksekusi terpisah untuk eksekusi fungsi, dan satu untuk kueri induk. Lima rencana fungsi terlihat seperti ini di panel bawah profiler:
Paket kueri induk adalah:
Mengeksekusi kueri tanpa TOP (5)
klausa menghasilkan rencana eksekusi penuh untuk masing-masing 504 baris dalam tabel Produk. Anda mungkin dapat melihat bagaimana ini dengan cepat keluar dari tangan dengan meja yang lebih besar.
Situasi untuk pemicu dibalik. Ini tidak menunjukkan informasi rencana pra-eksekusi, tetapi menyertakan rencana pasca-eksekusi. Ini mencerminkan sifat dasar pemicu; masing-masing dipecat satu kali untuk semua baris yang terpengaruh, bukan satu kali per baris.