表值函数和视图有什么区别?您是否可以用1做一些很难或不可能做的事?还是差异在于效率?
Answers:
无参数内联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
在运行时,对View和Inline TVF都进行内联,并且与派生表或CTE相似。可能无法对它们进行整体评估(甚至在某些情况下甚至根本无法评估),或者在其他情况下可能会多次评估。多语句TVF将始终被评估并存储在返回表类型(基本上是表变量)中
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
在决定是否将我转换为a或a时,我通常有一个经验法则。SELECT
VIEW
TVF
该视图是否需要2秒钟以上的时间才能完成,并且有10,000条以上的记录?如果是,则将其转换为TVF。如果没有,那就别管它了。
当然,规则完全基于性能。
对于TVF,我可以使用CROSS APPLY
,例如,将其视为表,但是传递特定值,例如主键。
WHERE ID = xxx
,其中“ xxx”是我在SELECT中传递的值。
性能更快!
如果我有TVF的视图,则必须允许该视图带回超过200万行,而返回的行数不到SELECT中的1%。
需要考虑的事情。
我发现当在函数的返回表上指定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
RETURNS
子句的内联函数)不需要创建任何临时表,因此它的运行速度至少是其两倍。可能要快得多,因为优化器可以将其查询包括在优化中
Is Updatable
?