Ve fonksiyonlar hakkında hiçbir şey yok. İşlev bilgileri gerçek planda neden eksik?
Bu performans nedeniyle tasarım gereğidir.
İçeren BEGIN
ve END
tanımdaki işlevler, her giriş satırı için yeni bir T-SQL yığın çerçevesi oluşturur. Başka bir deyişle, işlev gövdesi her giriş satırı için ayrı ayrı yürütülür . Bu tek gerçek, T-SQL skaler ve çoklu deyim işlevleriyle ilişkili çoğu performans sorununu açıklar (satır içi tablo değerli işlevlerin BEGIN...END
sözdizimini kullanmadığını unutmayın ).
Sorunuz bağlamında, bu SHOWPLAN
her satır için tam çıktı ile sonuçlanır . XML planı çıktısı oldukça ayrıntılı ve üretilmesi pahalıdır, bu nedenle her satır için tam çıktı üretmek genel anlamda kötü bir fikir olacaktır.
Misal
Kimliğine göre bir ürünün adını döndüren AdventureWorks örnek veritabanında oluşturulan aşağıdaki T-SQL skaler işlevini göz önünde bulundurun :
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;
İcra öncesi plan
Bir yürütme öncesi plan (SSMS'de tahmini plan), üst ifade ve iç içe işlev çağrıları için plan bilgilerini gösterir:
-- Pre-execution plan shows main query and nested function call
SET SHOWPLAN_XML ON;
GO
SELECT dbo.DumbNameLookup(1);
GO
SET SHOWPLAN_XML OFF;
SSMS çıkışı:
SQL Sentry Plan Explorer'da görüntülenen aynı XML , çağrıların iç içe doğasını daha net gösterir:
Yürütme sonrası çıktı
SSMS, yürütme sonrası plan çıktısı istendiğinde yalnızca ana sorgunun ayrıntılarını gösterir:
-- Post-execution plan shows main query only
SET STATISTICS XML ON;
SELECT dbo.DumbNameLookup(1);
SET STATISTICS XML OFF;
Aksi yapmanın performans etkisi, SQL Server Profiler'deki Showplan XML İstatistik Profili Olay Sınıfı kullanılarak, işlevi birden çok kez çağıran bir sorgu kullanılarak (giriş satırı başına bir kez) gösterilebilir:
SELECT TOP (5)
p.ProductID,
dbo.DumbNameLookup(p.ProductID)
FROM Production.Product AS p;
Profiler çıkışı:
İşlev yürütmeleri için beş, üst sorgu için bir tane yürütme sonrası plan vardır. Beş işlev planı profiler alt bölmesinde şöyle görünür:
Üst sorgu planı:
Sorguyu TOP (5)
cümle olmadan yürütmek, Ürün tablosundaki 504 satırın her biri için tam bir yürütme planıyla sonuçlanır. Muhtemelen bunun daha büyük tablolarla nasıl çabucak kontrolden çıktığını görebilirsiniz.
Tetikleyicilerin durumu tersine çevrilir. Bunlar yürütme öncesi plan bilgilerini göstermez, ancak yürütme sonrası planı içerir. Bu, tetikleyicilerin kümeye dayalı doğasını yansıtır; her biri, etkilenen tüm satırlar için bir satır yerine bir kez tetiklenir.