1. ホーム
  2. sql-server

[解決済み] 表形式関数(TVF)とビューの比較

2023-05-23 15:34:21

質問

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

どのように解決するのですか?

パラメータレスインラインTVFと非マテリアライズドViewは非常によく似ています。思い浮かぶいくつかの機能的な違いは以下のとおりです。

ビュー

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を直接パラメータ化する機能は、ビューに対する同等のパラメータ化されたクエリよりも良い実行計画を導くことができます。