web-dev-qa-db-ja.com

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

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

71
Haoest

パラメータなしのインライン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を直接パラメーター化する機能により、ビューに対する同等のパラメーター化されたクエリよりも優れた実行プランが得られる場合があります。

117
Martin Smith

関数の戻りテーブルでPKが指定されている場合、MultiStatement TVFとの結合のパフォーマンスはビューよりもはるかに優れていることがわかりました。

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
0
Douglas