テーブル値関数(TVF)とビュー


83

テーブル値関数とビューの違いは何ですか?1つでできることで、他の1つでは難しい、または不可能なことはありますか?それとも違いは効率にありますか?

回答:


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    

実行時に、ビューとインラインTVFは両方ともインライン化され、派生テーブルまたはCTEと同様に扱われます。それらは完全に評価されない場合もあれば(場合によってはまったく評価されない場合もあります)、他の場合は複数回評価される場合もあります。マルチステートメントTVFは常に評価され、戻りテーブルタイプ(基本的にはテーブル変数)に格納されます。

場合によっては、インラインTVFを直接パラメーター化する機能により、ビューに対する同等のパラメーター化されたクエリよりも優れた実行プランが得られることがあります。


3
tvfとはどういう意味ですかIs Updatable
Royi Namir 2012

2
@ RoyiNamir-インラインTVFを使用して、ビューと同様にベーステーブルを更新できます。
マーティンスミス

TVFがそれ自体からreturendテーブルを更新できるということですか?
Royi Namir 2012

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 optionVIEW_METADATA
Martin Smith

5

自分をaに変換するか、に変換するかを決定する際には、一般的に経験則があります。SELECTVIEWTVF

ビューが完了するまでに2秒以上かかり、10,000を超えるレコードがありますか?はいの場合は、TVFに変換します。そうでない場合は、そのままにしておきます。

もちろん、ルールは純粋にパフォーマンスに基づいています

TVFを使用するCROSS APPLYと、たとえば、を使用してテーブルとして扱うことができますが、主キーなどの特定の値を渡すことができます

WHERE ID = xxx、ここで、「xxx」はSELECTで渡す値です。

パフォーマンスははるかに高速です!

TVFのビューがある場合、SELECTでその1%未満を返すためだけに、ビューが200万行を超える行を戻すことを許可する必要があります。

考えるべきこと。


2

関数の戻りテーブルでPKが指定されている場合、MultiStatementTVFとの結合のパフォーマンスは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句を持つ関数は、一時テーブルを作成する必要がないため、少なくとも2倍の速度で実行されます。オプティマイザーがクエリを最適化に含めることができるため、おそらくはるかに高速です
Panagiotis Kanavos 2018年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.