Multi-deyim Tablo Değerli İşlev vs satır İçi Tablo Değerli İşlev
Gösteri, sadece örtmek için birkaç örnek:
Satır İçi Tablo Değerli
CREATE FUNCTION MyNS.GetUnshippedOrders()
RETURNS TABLE
AS
RETURN SELECT a.SaleId, a.CustomerID, b.Qty
FROM Sales.Sales a INNER JOIN Sales.SaleDetail b
ON a.SaleId = b.SaleId
INNER JOIN Production.Product c ON b.ProductID = c.ProductID
WHERE a.ShipDate IS NULL
GO
Çok Deyim Tablo Değerli
CREATE FUNCTION MyNS.GetLastShipped(@CustomerID INT)
RETURNS @CustomerOrder TABLE
(SaleOrderID INT NOT NULL,
CustomerID INT NOT NULL,
OrderDate DATETIME NOT NULL,
OrderQty INT NOT NULL)
AS
BEGIN
DECLARE @MaxDate DATETIME
SELECT @MaxDate = MAX(OrderDate)
FROM Sales.SalesOrderHeader
WHERE CustomerID = @CustomerID
INSERT @CustomerOrder
SELECT a.SalesOrderID, a.CustomerID, a.OrderDate, b.OrderQty
FROM Sales.SalesOrderHeader a INNER JOIN Sales.SalesOrderHeader b
ON a.SalesOrderID = b.SalesOrderID
INNER JOIN Production.Product c ON b.ProductID = c.ProductID
WHERE a.OrderDate = @MaxDate
AND a.CustomerID = @CustomerID
RETURN
END
GO
Tek tip (in-line veya çok deyim) üzerinde kullanmanın bir avantajı var mı? Biri diğerinden daha iyi ya da farkları vardır tamamen sözdizimsel zaman belli senaryolar var mı? İki örnek sorgular farklı şeyler yapıyor farkındayım ama bu şekilde onları yazarım bir sebep var mı?
Onlar hakkında okuma ve farkları/avantajları gerçekten açıklanmış değil.
CEVAP
Matt'in yorum araştırma, orijinal ifademi revize ettim. O doğru olacak bir fark performans arasında bir satır içi tablo değerli işlev (İTVF) ve bir multi-deyim tablo değerli işlev (MSTVF) bile, her ikisi de sadece çalıştırmak bir deyim. SQL Server, söz konusu yürütme planı masalarda son istatistiklere kullanarak hesaplıyor bir İTVF biraz VIEW
gibi muamele edecektir. Bir MSTVF bir tabloya SELECT deyimi tüm içeriği değişken doldurma ve sonra o katılarak eşdeğerdir. Böylece, derleyici herhangi bir tablo MSTVF tablolar istatistikleri kullanın. Yani, her şey aynı, nadiren olan) olan İTVF, MSTVF daha iyi yapacak. İstatistik açısından ancak gelen yok denecek kadar azdı benim testleri, dikkat çekici oldu.
Senin durumunda, iki işlevi, işlevsel olarak eşdeğer değildir. MSTV fonksiyonu ekstra bir sorgu denir her zaman yapar ve en önemlisi, Müşteri Kimliği üzerinde filtreler. Büyük bir sorgu iyileştiricisi her Müşteri Kimliği işlevi geçirilen aramak gerekir olarak katılır diğer türleri yararlanmak mümkün olmaz. Ancak, eğer yeniden yazdım senin MSTV gibi bir çok fonksiyonu
CREATE FUNCTION MyNS.GetLastShipped()
RETURNS @CustomerOrder TABLE
(
SaleOrderID INT NOT NULL,
CustomerID INT NOT NULL,
OrderDate DATETIME NOT NULL,
OrderQty INT NOT NULL
)
AS
BEGIN
INSERT @CustomerOrder
SELECT a.SalesOrderID, a.CustomerID, a.OrderDate, b.OrderQty
FROM Sales.SalesOrderHeader a
INNER JOIN Sales.SalesOrderHeader b
ON a.SalesOrderID = b.SalesOrderID
INNER JOIN Production.Product c
ON b.ProductID = c.ProductID
WHERE a.OrderDate = (
Select Max(SH1.OrderDate)
FROM Sales.SalesOrderHeader As SH1
WHERE SH1.CustomerID = A.CustomerId
)
RETURN
END
GO
Sorgu iyileştirici mümkün olacaktır için arama fonksiyonu bir kez kurmak ve daha iyi bir yürütme planı ama yine de olmaz daha iyi bir eşdeğeri olmayan parametreli İTVS veya VIEW
.
İTVFs tercih edilmelidir bir MSTVFs zaman mümkün, çünkü bu veri, null ve harmanlama sütun tablo ise bildirin bu özellikleri bir multi-deyim tablo değerli işlev ve daha da önemlisi, sen-ecek almak daha iyi yürütme planları olan İTVF. Benim durumumda, bir İTVF bir GÖRÜNÜM daha iyi bir seçenek oldu ama kilometre değişebilir birçok şartlar bulamadım.
Matt için teşekkürler.
Ayrıca
Bu son zamanlarda ortaya gördüğümden beri, burada mükemmel bir analiz Tablo Değerli işlevler ve Multi-Deyim, satır İçi işlevleri arasında performans farkı karşılaştırarak Wayne Sheffield tarafından yapılır.
Varlık Çerçevesi Saklı Yordam Tablo De...
Bcp/BULK INSERT performans Tablo Değer...
Nasıl slideDown (veya göstermek) Kulla...
Dapper destek 2008-Değerli Tablo Param...
Nasıl saklı yordam için tablo değerli ...