2012-11-08 13 views
7

昨日、db fieldの型を取得しなければならないシナリオを得ました。そのベースに、フィールドの説明を記述する必要がありました。 Likeデータベース関数VS Caseステートメント

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

私はこのケースステートメントの代わりにdb関数を書くことを提案しました。これは、これが再利用可能になるからです。同様

Select dbo.GetTypeName(DB_Type) 
from DB_table 

興味深い部分は、私たちの開発者の一つであるが、データベース機能を使用すると、database functionsとして非効率的になるというCase statementより遅いです。私は効率的な面でより良いアプローチである答えを見つけるためにインターネット上で検索しましたが、残念ながら満足のいく回答とはみなされませんでした。あなたの考えを私に教えてください。どちらのアプローチが良いですか?

+1

この 'dbo.GetTypeName(DB_Type) 'は同じ' CASE'式を持っていますか?すなわち、 'CASE'式を直接クエリに書くことと、それをパフォーマンスと再利用性の点でユーザー定義関数***に入れることの違いについて質問しています。右? –

+0

はい!すべてが同じです。 –

答えて

7
UDF function is always slower than case statements 

次の記事が

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

UDFを使用する方法を提案している記事

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

を参照してください

概要:

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

1

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

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

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

関連する問題