テーブル変数は小さなテーブル向きらしい
記録
テーブル値はあまり多行テーブルを扱うことに向いていないようだ。
ユーザ定義関数でテーブル値を返す関数を定義し実行したところ、一時テーブルを使って組んだ同じ結果を返すバッチと比べて、結果が帰ってくるまで時間がかかった。
調べてみるとMSDNのtable (Transact-SQL)の制限事項と制約事項に次のような記述があった。
Table 変数には分布統計がないため、再コンパイルをトリガーしません。 したがって、多くの場合、オプティマイザーはテーブル変数に行がないことを前提としてクエリ プランを構築します。 このため、多数の行 (100 行を超える行) を使用する可能性がある場合は、テーブル変数を慎重に使用する必要があります。 このような場合、一時テーブルによって問題が解決することがあります。 または、テーブル変数を他のテーブルに結合するクエリの場合は、RECOMPILE ヒントを使用します。このヒントを使用すると、オプティマイザーがテーブル変数に適切な基数を使用するようになります。
扱うテーブルの大きさも考えてストアドプロシージャかユーザ定義関数か選ばないといけないことを知った。
不勉強のため調べないとわからないことが多い。SQL Server自習書読もう。