0

次の場合に使用する方が良いと混乱します。 報告目的で使用される非常に複雑なクエリがあります。簡易版はインラインテーブル値関数とストアドプロシージャ(SQL Server)

SELECT [type], COUNT(*) as total_num, COUNT(DISTINCT user_id) as uq_user_num 
    FROM table1 
    INNER JOIN table2 ON (...) 
    ... 
    WHERE table3.last_action_date BETWEEN :start_date AND :end_date 
    GROUP BY [type] 

ように私は、インライン関数やSTART_DATEとend_parametersを取り、このクエリを実行するストアドプロシージャを作成することができます見えます。
このタスクはデータの変更や複雑なロジックが含まれていないため、私は機能しません。また、後でAPPLYの結果を使用することもできます(現時点ではそれほど重要ではありません)。
プロシージャではなく関数を使用するのは意味がありますか?パフォーマンスの観点(実行プランのキャッシュなど)との違いはありますか?

ありがとうございます。

答えて

1

複数ステートメントのテーブル値関数を使用すると、プランのキャッシュとキャッシュされたプランの再利用の観点からPROCを使用するのと同様..ですインラインテーブル値関数を使用しますプランキャッシュからのビューを使用して再利用パースペクティブを計画することに似ています(再利用は、まったく同じステートメントが使用される、つまり同じパラメーター)。 同じことを考慮すると、複数ステートメントのテーブル値関数を使用する必要があります。

0

ビューを使用することもできます。表示されたパラメータが与えられている場合、結果に変更がない場合、ビューは効率的です。この場合、同じ開始日と終了日の2回の通話を行うと、結果は変わりません。

ただし、ストアドプロシージャと関数の主な違いの2つは、関数から更新/挿入を呼び出すことができず、ストアドプロシージャをselectステートメントの一部として呼び出すことができないことです。

詳細はこのスレッドを参照してください。

Function vs. Stored Procedure in SQL Server

+0

表示が機能しない - 結果をフィルタリングしてグループ化する必要があります。私の知る限り、表示するパラメータを渡す方法はありません – a1ex07

+1

質問を投稿する前にそのリンクを見ました。関数と手続きの違いについての良い情報がありますが、あまりにも一般的です。また、現時点では、 'SELECT'の中でプロシージャを呼び出すことにはまったく関心がありません。もし私がそうする必要があれば、私はいつもテーブル変数を宣言し、INSERT INTO ... EXECUTEでそれを設定し、変数を使用することができます。 – a1ex07

関連する問題