テーブル値関数とビューの違いは何ですか?1つでできることで、他の1つでは難しい、または不可能なことはありますか?それとも違いは効率にありますか?
回答:
パラメータのないインライン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
実行時に、ビューとインラインTVFは両方ともインライン化され、派生テーブルまたはCTEと同様に扱われます。それらは完全に評価されない場合もあれば(場合によってはまったく評価されない場合もあります)、他の場合は複数回評価される場合もあります。マルチステートメントTVFは常に評価され、戻りテーブルタイプ(基本的にはテーブル変数)に格納されます。
場合によっては、インライン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に変換するか、に変換するかを決定する際には、一般的に経験則があります。SELECT
VIEW
TVF
ビューが完了するまでに2秒以上かかり、10,000を超えるレコードがありますか?はいの場合は、TVFに変換します。そうでない場合は、そのままにしておきます。
もちろん、ルールは純粋にパフォーマンスに基づいています。
TVFを使用するCROSS APPLY
と、たとえば、を使用してテーブルとして扱うことができますが、主キーなどの特定の値を渡すことができます。
WHERE ID = xxx
、ここで、「xxx」はSELECTで渡す値です。
パフォーマンスははるかに高速です!
TVFのビューがある場合、SELECTでその1%未満を返すためだけに、ビューが200万行を超える行を戻すことを許可する必要があります。
考えるべきこと。
関数の戻りテーブルで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
RETURNS
句を持つ関数は、一時テーブルを作成する必要がないため、少なくとも2倍の速度で実行されます。オプティマイザーがクエリを最適化に含めることができるため、おそらくはるかに高速です
Is Updatable
?