表值函數:內聯與多語句 – 效能分析
在內聯和多語句表值函數 (TVF) 之間進行選擇會顯著影響查詢效能。 此比較突出了主要差異並提供了最佳使用指導。
內聯表值函數 (ITVF)
ITVF 與視圖類似,利用即時表結構和統計數據,通常會產生卓越的執行計劃。 這是一個例子:
<code class="language-sql">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</code>
多語句表值函數 (MSTVF)
MSTVF 使用預先定義的表格結構,無法存取即時統計資料。 它們的結構不同如下:
<code class="language-sql">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</code>
效能注意事項
通常,ITVF 優於 MSTVF,因為它們能夠利用即時統計數據。 然而,MSTVF 對於 ITVF 內不易實現的複雜操作可能更有效。
何時使用哪一種函數型別
在下列情況下選擇 ITVF:
在下列情況下選擇 MSTVF:
結論
ITVF 和 MSTVF 之間的最佳選擇完全取決於特定任務。 然而,ITVF 通常因其效能優勢和更好地利用資料庫統計資料而受到青睞。
以上是內聯函數與多語句表值函數:哪個效能比較好?的詳細內容。更多資訊請關注PHP中文網其他相關文章!