表值函数(TVF)与视图
表值函数和视图之间有什么区别? 有没有什么事情可以用1来完成,这与另一个很难或不可能做到。 还是差别在于效率?
无参数内联TVF和非物化视图非常相似。 下面有几个function上的差异。
查看
Accepts Parameters - No Expanded out by Optimiser - Yes Can be Materialized in advance - Yes (through indexed views) Is Updatable - Yes Can contain Multiple Statements - No Can have triggers - Yes Can use side-effecting operator - Yes
内联TVF
Accepts Parameters - Yes Expanded out by Optimiser - Yes Can be Materialized in advance - No Is Updatable - Yes Can contain Multiple Statements - No Can have triggers - No Can use side-effecting operator - No
多国语言TVFs
Accepts Parameters - Yes Expanded out by Optimiser - No Can be Materialized in advance - No Is Updatable - No Can contain Multiple Statements - Yes Can have triggers - No Can use side-effecting operator - No
在运行时Views和Inline TVF都是内联的,并且与派生表或CTE类似。 他们可能没有完整的评估(甚至在一些情况下甚至可能 ), 或者可能在其他评估中多次评估 。 多描述TVF将始终被评估并存储在返回表types(基本上是一个表variables)
有时直接参数化内联TVF的能力可以导致比针对视图的等同参数化查询更好的执行计划。
我发现在函数的返回表上指定一个PK时,与MultiStatement TVF的联接比Views更好。
CREATE FUNCTION [FORMREQS].[fnGetFormsStatus] () RETURNS /* Create a PK using two of the columns */ @Indexed TABLE ( [OrgID] [char](8) NOT NULL, [PkgID] [int] NOT NULL, [FormID] varchar(5) NOT NULL, PRIMARY KEY CLUSTERED(OrgID, PkgID) ) AS BEGIN INSERT @Indexed SELECT OrgID, PkgID, FormID FROM FormsTable RETURN END