Rumah >pangkalan data >tutorial mysql >Sebaris lwn. Fungsi Bernilai Jadual Berbilang Penyata dalam Pelayan SQL: Mana Yang Perlu Anda Pilih?
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!