2009-06-12 12 views
5

私は関数を使う初心者です。インライン関数はビューと非常によく似ています。私は正しいですか?インライン関数とビューの相違点

また、関数内にUPDATEステートメントを含めることはできますか?

答えて

-1

関数は、タスクまたは多くのタスクを実行します。ビューはクエリを介してデータを取得します。そのクエリーに適合するものは、あなたが制限されているものです。ある機能では、テーブル変数の選択、作成、データの削除、電子メールの送信、作成したCLRとのやりとりなど、低レベルのビューよりも強力な方法があります。

+1

パフォーマンスと移植性を最大限に高めるには、可能な場合は常に関数のビューを優先する必要があります。 – RedFilter

0

ビューは、クエリから返されるデータの「ビュー」です。ほとんどの疑似テーブルです。関数は、通常はデータを照会して得た値/テーブルを返します。関数が最終的に値/テーブルを返す場合は、関数内で任意のsql文を実行できます。

0

関数を使用すると、より具体的なビューを作成するためのパラメータを渡すことができます。あなたは州に基づいて顧客をつかみたいと言いましょう。関数は、あなたが探している状態を渡すことができ、その状態ですべての顧客を与えることができます。ビューはそれを行うことはできません。

+0

しかし、ビューはその状態を公開することができるため、where句を使用してフィルタリングできます。 – RedFilter

+0

それは本当です。しかし、コードを読んでいるプログラマーにとっては、機能は良く見えます。 Select * FROM CustomersByState( 'Iowa')はSELECT * FROM vCustomers WHERE State = 'Iowa'より読むのが簡単です。それはちょうど私の意見です。 –

2

更新:「インライン」の部分が欠落しているように見えます。しかし、誰かがVIEWと通常の関数の違いについて読んでみたい場合に備えて、私はここで答えを残しています。

SELECTを実行してデータを出力する関数しかない場合、それらは似ています。ただし、エンジンでVIEWを最適化できるため、同じではありません。たとえば、SELECT * FROM view1 WHERE x = 10;を実行すると、あなたはXにマップされているテーブルフィールドのインデックスを持っています。それが使用されます。一方、関数は検索の前に結果セットを作成するので、その中のWHEREを移動する必要があります。しかし、これは簡単ではありません。なぜなら、多くの列を持ち、同じSELECTステートメント内のすべての列をORDER BYできないからです。

したがって、データに対して「ビュー」を与える同じタスクでビューと関数を比較すると、VIEWがより適切な選択肢になります。

しかし、機能ははるかに多くを行うことができます。 JOINSまたはUNIONを使用してテーブルを結合することなく、複数のクエリを実行できます。結果を使用して複雑な計算を実行したり、追加のクエリを実行したり、ユーザーにデータを出力したりすることができます。関数は、データセットを返すことができるストアドプロシージャによく似ています。

1

大きな違いの1つは、関数がパラメータを取ることができ、VIEWはパラメータを取ることができないことです。

私はVIEWを好む傾向があります。これは標準的で移植性の高い実装です。 WHERE句がなければ、同等のVIEWが無意味であるときに関数を使用します。

たとえば、比較的大きな有効時間状態テーブル( '履歴'テーブル)を照会する機能があります。これがVIEWで、WHERE句を指定せずにクエリを実行しようとすると、かなりのデータ(最終的には)が得られます。関数を使用すると、データを必要とする場合は、開始日と終了日を指定します。関数はこの連絡先の設定方法です。なぜストアドプロシージャではないのですか?さて、私は、ユーザーが結果セットをさらにデータ(テーブル、VIEW、関数など)にジョインしたいと思っています。関数は、IMOがこれを行う最良の方法です。たとえば、ユーザーが結果セットを一時的表。

3

違いはありません。これらは両方とも、包含クエリーに拡張/ネストされています。

注:インデックス付きビューは異なると見なされますが、依然として展開されている可能性があります。また、複数の値を持つテーブル関数は、含まれているクエリの黒いボックスです。

Tony Rogerson: VIEWS - they offer no optimisation benefits; they are simply inline macros - use sparingly

Adam Machanic: Scalar functions, inlining, and performance: An entertaining title for a boring post

Related SO question: Does query plan optimizer works well with joined/filtered table-valued functions?

最後に、機能エリックZビアードさんのコメントとdownvote後

編集、で許可されていないテーブルへの書き込み...

質問と回答(私だけではない)はスカラーudfsに関するものではありません。 "インライン"は "インラインテーブル値関数"を意味します。非常に異なる概念...

+0

Sql Serverではなく、関数には正しくありません。関数はブラックボックスであり、インクルードするクエリには拡張されません。そのため、何かをクエリする関数を使用すると、パフォーマンスが恐ろしいものになります。この関数は各行に対して個別に処理されるため、重複したループになります。 –

+0

@Eric:インラインテーブル値関数の場合、私が言ったことは正しいです。私は、多値のTVFはブラックボックスだと言いました。質問と私の答えはブラックボックスである "スカラーudfs"を参照していません。 – gbn

+0

うん、私は "インライン"を逃した、あなたは正しい。 –

15

ここでは、多くの答えを読んだ後、インラインテーブル値関数と他の種類の関数(スカラーまたは複数行TVF )。

インラインTVFは単なるパラメータ化されたビューです。ビューのように拡大して最適化することができます。残念ながら、構文にはRETURNが含まれていますが、残念ながら、構文にはRETURNがあります。

ビュー上のインラインTVFの大きな利点は、強制的に実行することです

例えば、私たちには典型的なキンボールの星型モデルを使ったDWで多くの大きなファクトテーブルがありますが、私は実際のテーブル中心のモデルでは何の制約もなく呼び出され、何億もの行が返されます。適切なパラメータ化を使用してインラインTVFを使用すると、間違ってすべての行を尋ねることはできません。 二つ。

1

機能(msdn)での更新についての質問に答える:ステートメントは、関数内で ことによって作製することができる唯一の変更は、ローカルなど 関数にローカルオブジェクトへ 変更、ある

をカーソルまたは 変数。データベースへの変更 テーブル、関数に対してローカル でないカーソルの操作、カタログに 変更をしようと、 電子メールを送信し、ユーザーに返された結果 セットを生成するには、することはできませんアクションの 例であり、 が実行されます。

2

誰もこの側面を言及していないようです。

あなたはにインライン関数をUpdateを持つことはできませんが、それらは更新可能なビューだっただけであるかのように、あなたはに対してそれらをUpdateを書くことができます。

関連する問題