答えて
関数は、タスクまたは多くのタスクを実行します。ビューはクエリを介してデータを取得します。そのクエリーに適合するものは、あなたが制限されているものです。ある機能では、テーブル変数の選択、作成、データの削除、電子メールの送信、作成したCLRとのやりとりなど、低レベルのビューよりも強力な方法があります。
ビューは、クエリから返されるデータの「ビュー」です。ほとんどの疑似テーブルです。関数は、通常はデータを照会して得た値/テーブルを返します。関数が最終的に値/テーブルを返す場合は、関数内で任意のsql文を実行できます。
関数を使用すると、より具体的なビューを作成するためのパラメータを渡すことができます。あなたは州に基づいて顧客をつかみたいと言いましょう。関数は、あなたが探している状態を渡すことができ、その状態ですべての顧客を与えることができます。ビューはそれを行うことはできません。
しかし、ビューはその状態を公開することができるため、where句を使用してフィルタリングできます。 – RedFilter
それは本当です。しかし、コードを読んでいるプログラマーにとっては、機能は良く見えます。 Select * FROM CustomersByState( 'Iowa')はSELECT * FROM vCustomers WHERE State = 'Iowa'より読むのが簡単です。それはちょうど私の意見です。 –
更新:「インライン」の部分が欠落しているように見えます。しかし、誰かがVIEWと通常の関数の違いについて読んでみたい場合に備えて、私はここで答えを残しています。
SELECTを実行してデータを出力する関数しかない場合、それらは似ています。ただし、エンジンでVIEWを最適化できるため、同じではありません。たとえば、SELECT * FROM view1 WHERE x = 10;を実行すると、あなたはXにマップされているテーブルフィールドのインデックスを持っています。それが使用されます。一方、関数は検索の前に結果セットを作成するので、その中のWHEREを移動する必要があります。しかし、これは簡単ではありません。なぜなら、多くの列を持ち、同じSELECTステートメント内のすべての列をORDER BYできないからです。
したがって、データに対して「ビュー」を与える同じタスクでビューと関数を比較すると、VIEWがより適切な選択肢になります。
しかし、機能ははるかに多くを行うことができます。 JOINSまたはUNIONを使用してテーブルを結合することなく、複数のクエリを実行できます。結果を使用して複雑な計算を実行したり、追加のクエリを実行したり、ユーザーにデータを出力したりすることができます。関数は、データセットを返すことができるストアドプロシージャによく似ています。
大きな違いの1つは、関数がパラメータを取ることができ、VIEWはパラメータを取ることができないことです。
私はVIEWを好む傾向があります。これは標準的で移植性の高い実装です。 WHERE句がなければ、同等のVIEWが無意味であるときに関数を使用します。
たとえば、比較的大きな有効時間状態テーブル( '履歴'テーブル)を照会する機能があります。これがVIEWで、WHERE句を指定せずにクエリを実行しようとすると、かなりのデータ(最終的には)が得られます。関数を使用すると、データを必要とする場合は、開始日と終了日を指定します。関数はこの連絡先の設定方法です。なぜストアドプロシージャではないのですか?さて、私は、ユーザーが結果セットをさらにデータ(テーブル、VIEW、関数など)にジョインしたいと思っています。関数は、IMOがこれを行う最良の方法です。たとえば、ユーザーが結果セットを一時的表。
違いはありません。これらは両方とも、包含クエリーに拡張/ネストされています。
注:インデックス付きビューは異なると見なされますが、依然として展開されている可能性があります。また、複数の値を持つテーブル関数は、含まれているクエリの黒いボックスです。
Adam Machanic: Scalar functions, inlining, and performance: An entertaining title for a boring post
最後に、機能エリックZビアードさんのコメントとdownvote後
編集、で許可されていないテーブルへの書き込み...
質問と回答(私だけではない)はスカラーudfsに関するものではありません。 "インライン"は "インラインテーブル値関数"を意味します。非常に異なる概念...
Sql Serverではなく、関数には正しくありません。関数はブラックボックスであり、インクルードするクエリには拡張されません。そのため、何かをクエリする関数を使用すると、パフォーマンスが恐ろしいものになります。この関数は各行に対して個別に処理されるため、重複したループになります。 –
@Eric:インラインテーブル値関数の場合、私が言ったことは正しいです。私は、多値のTVFはブラックボックスだと言いました。質問と私の答えはブラックボックスである "スカラーudfs"を参照していません。 – gbn
うん、私は "インライン"を逃した、あなたは正しい。 –
ここでは、多くの答えを読んだ後、インラインテーブル値関数と他の種類の関数(スカラーまたは複数行TVF )。
インラインTVFは単なるパラメータ化されたビューです。ビューのように拡大して最適化することができます。残念ながら、構文にはRETURN
が含まれていますが、残念ながら、構文にはRETURN
があります。
ビュー上のインラインTVFの大きな利点は、強制的に実行することです
例えば、私たちには典型的なキンボールの星型モデルを使ったDWで多くの大きなファクトテーブルがありますが、私は実際のテーブル中心のモデルでは何の制約もなく呼び出され、何億もの行が返されます。適切なパラメータ化を使用してインラインTVFを使用すると、間違ってすべての行を尋ねることはできません。 二つ。
機能(msdn)での更新についての質問に答える:ステートメントは、関数内で ことによって作製することができる唯一の変更は、ローカルなど 関数にローカルオブジェクトへ 変更、ある
をカーソルまたは 変数。データベースへの変更 テーブル、関数に対してローカル でないカーソルの操作、カタログに 変更をしようと、 電子メールを送信し、ユーザーに返された結果 セットを生成するには、することはできませんアクションの 例であり、 が実行されます。
誰もこの側面を言及していないようです。
あなたはにインライン関数をUpdate
文を持つことはできませんが、それらは更新可能なビューだっただけであるかのように、あなたはに対してそれらをUpdate
文を書くことができます。
- 1. 引数と関数と関数ポインタの相違点
- 2. Grailsのビューとテンプレートの相違点
- 3. 関数と新しい関数のJavaScriptの相違点
- 4. ファーストクラス関数と高次関数の相違点
- 5. zlib: `deflate`関数と` compress`関数の相違点
- 6. インライン関数と静的インライン関数の違い
- 7. importとconstとの相違点とcommonjsでの相違点
- 8. =と:=の相違点
- 9. 小数点と小数点の相違点
- 10. PHPUnitとPHPSpecの相違点と相違点
- 11. 目的関数-cの括弧と角括弧の相違点
- 12. モナドの型コンストラクタとリターン関数の相違点(Haskell)
- 13. `新しい関数(){this.x = 1}`と `{x:1} 'の相違点
- 14. $(window).load()と$(document).ready()関数の相違点
- 15. MSBuildとTFSBuildの相違点
- 16. string.hとstrings.hの相違点
- 17. NSArrayとNSMutableArrayの相違点
- 18. System.Web.CacheとHTTPContext.Curent.Cacheの相違点
- 19. saveとsave_model()の相違点
- 20. ディスパッチキューとNSOperationQueueの相違点
- 21. HTML5とjQueryの相違点
- 22. QtGui.QApplicationとQtCore.QCoreApplicationの相違点
- 23. CDO.MessageとSystem.Net.Mailの相違点
- 24. TransactionとTransactionScopeの相違点
- 25. addonGlobalLayoutListenerとaddOnPreDrawListenerの相違点
- 26. getGenericParameterTypesとgetParameterTypesの相違点
- 27. vmlinuxとvmlinux.oの相違点
- 28. KeyEventArgs.systemKeyとKeyEventArgs.Keyの相違点
- 29. Thread.sleep()とTimeUnit.SECONDS.sleep()の相違点
- 30. レポートとサブレポートの相違点
パフォーマンスと移植性を最大限に高めるには、可能な場合は常に関数のビューを優先する必要があります。 – RedFilter