表值函数和视图之间有什么区别?是否有一些你可以做的事情,那是另一个很难或不可能做到的事情?或者差异在于效率?
答案 0 :(得分:117)
无参数内联TVF和非物化视图非常相似。我想到的一些功能差异在下面。
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
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
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
在运行时,视图和内联TVF都内联并且与派生表或CTE类似地处理。它们可能不会被完整地评估(甚至在某些情况下甚至根本不进行评估)or may be evaluated multiple times in others。多语句TVF将始终被评估并存储在返回表类型中(基本上是表变量)
答案 1 :(得分:1)
在决定将我的SELECT
转换为VIEW
还是TVF
时,我通常有一个经验法则。
该视图是否需要2秒以上的时间才能完成,并且 超过10,000条记录?如果是,则将其转换为TVF。如果没有,就离开
当然,规则完全基于性能。
例如,使用TVF,我可以使用CROSS APPLY
将其视为表,但是可以传递特定值,例如主键。
WHERE ID = xxx
,其中“ xxx”是我在SELECT中传递的值。
性能更快!
如果我有TVF的视图,则必须允许该视图带回超过200万行,而返回的行数不到SELECT中的1%。
需要考虑的事情。
答案 2 :(得分:0)
我发现当在函数返回表中指定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