表值函数:内联与多语句 – 性能分析
在内联和多语句表值函数 (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中文网其他相关文章!