表值函数(TVF)与视图


83

表值函数和视图有什么区别?您是否可以用1做一些很难或不可能做的事?还是差异在于效率?

Answers:


134

无参数内联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    

多声明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    

在运行时,对View和Inline TVF都进行内联,并且与派生表或CTE相似。可能无法对它们进行整体评估(甚至在某些情况下甚至根本无法评估),或者在其他情况下可能会多次评估。多语句TVF将始终被评估并存储在返回表类型(基本上是表变量)中

有时,直接对内联TVF进行参数化的能力比对视图进行等效的参数化查询可以导致更好的执行计划。


3
电视是什么意思Is Updatable
罗伊·纳米尔

2
@RoyiNamir-内联TVF可用于更新基本表,类似于视图。
马丁史密斯

您的意思是说TVF可以从自身更新returend表吗?
罗伊·纳米尔

12
@RoyiNamir-示例CREATE TABLE T(C INT);EXEC('CREATE FUNCTION F () RETURNS TABLE AS RETURN (SELECT * FROM T)');INSERT INTO F() VALUES(1);SELECT * FROM T;
马丁·史密斯

其他一些不同之处with check option以及VIEW_METADATA
马丁·史密斯

5

在决定是否将我转换为a或a时,我通常有一个经验法则SELECTVIEWTVF

该视图是否需要2秒钟以上的时间才能完成,并且有10,000条以上的记录?如果是,则将其转换为TVF。如果没有,那就别管它了。

当然,规则完全基于性能

对于TVF,我可以使用CROSS APPLY,例如,将其视为表,但是传递特定值,例如主键

WHERE ID = xxx,其中“ xxx”是我在SELECT中传递的值。

性能更快!

如果我有TVF的视图,则必须允许该视图带回超过200万行,而返回的行数不到SELECT中的1%。

需要考虑的事情。


2

我发现当在函数的返回表上指定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

1
意见也是如此。实际上,建立表会使功能慢得多。内联函数(即具有单个RETURNS子句的内联函数)不需要创建任何临时表,因此它的运行速度至少是其两倍。可能要快得多,因为优化器可以将其查询包括在优化中
Panagiotis Kanavos
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.