多语句表值函数与内联表值函数区别?

转载 2018年04月16日 19:06:37

有几个例子要展示,以防万一:

内联表值

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

多语句表值

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

使用一种类型(内联语句或多语句)比另一种类型有优势吗?当其中一种比另一种更好时,是否存在某种特定的情景,还是仅仅是句法上的差异?我意识到这两个示例查询所做的事情不同,但我是否有理由这样写它们呢?

回答:

在内部,SQLServer处理内联表值函数就像对待视图一样,并且处理多语句表值函数的方式类似于存储过程。

当内联表值函数被用作外部查询的一部分时,查询处理器扩展UDF定义并生成访问底层对象的执行计划,使用这些对象上的索引。

对于多语句表值函数,为函数本身创建执行计划并存储在执行计划缓存中(一旦函数第一次执行)。如果多语句表值函数被用作较大查询的一部分,那么优化器就不知道函数返回了什么,因此做出了一些标准假设--实际上它假设函数将返回一个行。并且,函数的返回将通过对带有一行的表进行表扫描来访问。

当多语句表值函数返回大量行并在外部查询中被连接时,多语句表值函数的性能可能会很差。性能问题主要归因于这样一个事实:如果返回了一行,优化器将生成一个计划,这不一定是最合适的计划。

我们发现,由于这些潜在的性能问题,在可能的情况下,应该优先使用内联表值函数,而不是多语句函数(当UDF将用作外部查询的一部分时)。


参考:

https://cloud.tencent.com/developer/ask/28238


多语句表值函数与内联表值函数对比

注:内联表值函数性能更好,能做成 内联表值函数 的,不要做成 多语句表值函数   原表值函数(多语句) 优化后的表值函数(内联) SQL -- =...
  • yenange
  • yenange
  • 2016-09-07 09:40:08
  • 2645

内联表值函数

内联表值函数是一种可重用的表表达式,能够支持输入参数。除了支持输入参数以外,内联表值函数在其他方面都与视图相似。 IF OBJECT_ID('dbo.fn_getstu') IS NOT NULL ...
  • linkedin_37130665
  • linkedin_37130665
  • 2017-01-17 05:49:14
  • 703

内联表值函数,一种可重用的表表达式

**支持输入参数,除此之外和视图很相似,可以看做带参数的视图** 用户定义函数是接受参数、执行操作(例如复杂计算)并将操作结果以值的形式返回的 Transact-SQL 或公共语言运行时 (CL...
  • younghaiqing
  • younghaiqing
  • 2016-11-16 08:42:59
  • 338

经典的多语句表值函数

set ANSI_NULLS ONset QUOTED_IDENTIFIER ONgoCREATE FUNCTION [dbo].[ufnGetContactInformation](@Contact...
  • chinahuyong
  • chinahuyong
  • 2008-10-17 17:15:00
  • 2248

sql中的表值函数与标量值函数区别与用法

通俗来讲: 听名字就知道区别了  表值函数返回的是一张表结果,就和一个select查询语句一样,只不过里面带入了参数或者很复杂; 标量值函数返回的只是一个值 一 、表值函数又分为内联函数与多语句函数...
  • qq_28643437
  • qq_28643437
  • 2017-07-25 16:13:28
  • 1629

mssql表值函数

-- 字符串分隔函数CREATE FUNCTION [dbo].[StrSplit] (@str nvarchar(max) -- 字符串 ,@spliter nvarchar(10)...
  • jc_benben
  • jc_benben
  • 2016-05-20 15:00:46
  • 311

多语句表值函数.doc

  • 2014年12月03日 16:24
  • 140KB
  • 下载

sqlserver2008r2中使用表值函数

1.定义表值类型 CREATE TYPE [dbo].[TableType] AS TABLE( [Id] [varchar](20) NOT NULL, [Num] [int] NOT NULL...
  • lnc2003
  • lnc2003
  • 2015-01-08 13:20:11
  • 562

Sql 中用户定义函数

一.用户定义函数可以接受参数,执行操作并
  • htwindows
  • htwindows
  • 2014-06-12 23:38:12
  • 754

表值函数

表值函数和标量值函数的不同是 表值函数是返回一个Table类型  Table类型相当与一张存储在内存中的一张虚拟表.表值函数的语法:CREATE FUNCTION [ schema_name. ] f...
  • jadeflute
  • jadeflute
  • 2010-01-13 16:48:00
  • 7668
收藏助手
不良信息举报
您举报文章:多语句表值函数与内联表值函数区别?
举报原因:
原因补充:

(最多只允许输入30个字)