SORU
31 Mart 2010, ÇARŞAMBA


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
31 Mart 2010, ÇARŞAMBA


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.

His original blog post.

Copy on SQL Server Central

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Ciaran Blumenfeld

    Ciaran Blume

    20 NİSAN 2009
  • disneychannel

    disneychanne

    19 ŞUBAT 2006
  • Julia Graf

    Julia Graf

    6 Mayıs 2006