テーブル値関数とビューの違いは何ですか? 一方ではできて、他方では難しい、または不可能なことはありますか? それとも違いは効率にありますか?
3 に答える
パラメーターのないインライン 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
MultiStatement 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 を直接パラメーター化する機能により、ビューに対する同等のパラメーター化されたクエリよりも優れた実行プランが得られることがあります。
myをに変換するか を に変換するかを決定する際には、一般的に経験則があります。SELECT
VIEW
TVF
ビューの終了に 2 秒以上かかり、10,000 を超えるレコードがあるか? YESならTVF化。そうでない場合は、放っておいてください。
もちろん、ルールは純粋にパフォーマンスに基づいています。
TVF では、CROSS APPLY
たとえばテーブルとして扱うために a を使用できますが、主キーなどの特定の値を渡します。
WHERE ID = xxx
ここで、「xxx」は SELECT で渡す値です。
パフォーマンスははるかに高速です。
TVF のビューがあった場合、ビューが 200 万行以上を戻して、SELECT でその 1% 未満しか返さないようにする必要があります。
考えるべきこと。
関数の戻りテーブルで 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