10

昨日、タイプaを取得し、db fieldそれに基づいてフィールドの説明を記述しなければならないシナリオがありました。好き

Select ( Case DB_Type When 'I' Then 'Intermediate'
                      When 'P' Then 'Pending'
                      Else 'Basic'
         End)
From DB_table

再利用しやすいので、このcaseステートメントの代わりにdb関数を作成することをお勧めします。好き

Select dbo.GetTypeName(DB_Type) 
from DB_table

興味深い部分は、私たちの開発者の1人が、データベース関数の使用は。よりも遅いため非効率になると述べました。インターネットで検索して、効率の面でより良いアプローチを見つけましたが、残念ながら、満足のいく答えと見なすことができるものは何も見つかりませんでした。あなたの考えを教えてください、どちらのアプローチが良いですか?database functionsCase statement

4

3 に答える 3

11
UDF function is always slower than case statements

記事を参照してください

http://blogs.msdn.com/b/sqlserverfaq/archive/2009/10/06/performance-benefits-of-using-expression-over-user-defined-functions.aspx

次の記事は、UDFをいつ使用するかを示しています

http://www.sql-server-performance.com/2005/sql-server-udfs/

概要 :

ユーザー定義関数を使用すると、パフォーマンスが大幅に低下します。この低下は、クエリがUDFを多数の行(通常は1000以上)に適用する場合のクエリ実行時間の低下として現れます。SQL Serverデータベースエンジンは処理のように独自の内部カーソルを作成する必要があるため、ペナルティが発生します。各行で各UDFを呼び出す必要があります。WHERE句でUDFが使用されている場合、これは行のフィルタリングの一部として発生する可能性があります。選択リストでUDFが使用されている場合、これはクエリの結果を作成してクエリ処理の次の段階に渡すときに発生します。SQL Serverの速度を最も低下させるのは、行ごとの処理です。

于 2012-11-08T07:25:35.747 に答える
1

あなたのデボルパーは正しいです。関数はクエリを遅くします。

https://sqlserverfast.com/?s=user+defined+ugly

Calling functionsis like:
wrap parts into paper
put it into a bag
carry it to the mechanics
let him unwrap, do something, wrapt then result
carry it back
use it
于 2012-11-08T07:19:50.137 に答える
1

スカラー関数(1つの値を返す関数)を使用する場合、関数の内容は行ごとに1回実行されますが、caseステートメントはセット全体で実行されます。

セット全体に対して操作することにより、サーバーがクエリをより効率的に最適化できるようになります。

したがって、理論では、同じクエリが大きなデータセットに対して双方向で実行されるため、関数の速度が低下するはずです。ただし、データに対して操作する場合、違いはわずかである可能性があるため、両方の方法を試してテストし、パフォーマンスのトレードオフが関数の有用性を高める価値があるかどうかを判断する必要があります。

于 2012-11-08T07:33:08.390 に答える