Rumah >pangkalan data >tutorial mysql >Sebaris lwn. Fungsi Bernilai Jadual Berbilang Penyata dalam Pelayan SQL: Mana Yang Perlu Anda Pilih?

Sebaris lwn. Fungsi Bernilai Jadual Berbilang Penyata dalam Pelayan SQL: Mana Yang Perlu Anda Pilih?

Mary-Kate Olsen
Mary-Kate Olsenasal
2025-01-12 19:12:42680semak imbas

Inline vs. Multi-Statement Table-Valued Functions in SQL Server: Which Should You Choose?

Fungsi bernilai jadual SQL Server: Perbandingan fungsi sebaris dan fungsi berbilang pernyataan

Fungsi nilai jadual (TVF) SQL Server membenarkan berbilang baris data dikembalikan daripada satu panggilan fungsi. Walau bagaimanapun, TVF terbahagi terutamanya kepada dua jenis: fungsi berbilang kenyataan dan fungsi sebaris.

Fungsi Bernilai Jadual Sebaris (ITVF)

ITVF ditakrifkan menggunakan pernyataan SELECT tunggal dalam definisi fungsi. Mereka berkelakuan seperti pandangan, mewarisi jenis data, kebolehbatalan dan pengumpulan lajur yang dirujuk.

Fungsi Bernilai Jadual Penyata Berbilang (MSTVF)

MSTVF ditakrifkan menggunakan berbilang pernyataan, biasanya termasuk pernyataan INSERT untuk mengisi pembolehubah jadual. Mereka memerlukan pengisytiharan eksplisit jenis data lajur dan sifat dalam definisi fungsi.

Perbezaan Prestasi

Walaupun berbeza sintaks, perbezaan prestasi antara ITVF dan MSTVF adalah ketara. ITVF memanfaatkan sepenuhnya pengoptimum pertanyaan berasaskan statistik jadual SQL Server untuk menjana pelan pelaksanaan yang cekap. MSTVF lebih seperti pembolehubah jadual, pengoptimum pertanyaan mempunyai kesan pengoptimuman yang lemah, dan kecekapan pelan pelaksanaan agak rendah.

Senario yang berkenaan

Pilihan ITVF dan MSTVF bergantung pada senario aplikasi tertentu. Jika logik fungsi boleh dinyatakan dalam pernyataan SELECT yang mudah, ITVF biasanya lebih cekap dan disyorkan. MSTVF lebih sesuai apabila pemprosesan tambahan atau parameterisasi diperlukan.

Contoh

Pertimbangkan contoh berikut:

<code class="language-sql">-- 内联表值函数
CREATE FUNCTION 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

-- 多语句表值函数
CREATE FUNCTION 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</code>

Dalam contoh ini, MSTVF digunakan untuk mengira pesanan terakhir dihantar untuk pelanggan tertentu, yang memerlukan pemprosesan tambahan. ITVF hanya perlu mendapatkan semula senarai semua pesanan yang tidak dihantar, yang lebih sesuai untuk operasi penapisan mudah.

Atas ialah kandungan terperinci Sebaris lwn. Fungsi Bernilai Jadual Berbilang Penyata dalam Pelayan SQL: Mana Yang Perlu Anda Pilih?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn