表值函数(TVF)与视图

时间:2011-02-10 16:54:40

标签: sql-server sql-view sql-function

表值函数和视图之间有什么区别?是否有一些你可以做的事情,那是另一个很难或不可能做到的事情?或者差异在于效率?

3 个答案:

答案 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  

内联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    

MultiStatement TVF

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将始终被评估并存储在返回表类型中(基本上是表变量)

Occasionally the ability to parameterise inline TVFs directly can lead to a better execution plan than the equivalent parameterised query against a view.

答案 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