とりあえず半歩

学んだことを1日1個、簡単なことでも良いから記録していきたい。

テーブル変数は小さなテーブル向きらしい

記録

テーブル値はあまり多行テーブルを扱うことに向いていないようだ。

ユーザ定義関数でテーブル値を返す関数を定義し実行したところ、一時テーブルを使って組んだ同じ結果を返すバッチと比べて、結果が帰ってくるまで時間がかかった。

調べてみるとMSDNtable (Transact-SQL)制限事項と制約事項に次のような記述があった。

Table 変数には分布統計がないため、再コンパイルをトリガーしません。 したがって、多くの場合、オプティマイザーはテーブル変数に行がないことを前提としてクエリ プランを構築します。 このため、多数の行 (100 行を超える行) を使用する可能性がある場合は、テーブル変数を慎重に使用する必要があります。 このような場合、一時テーブルによって問題が解決することがあります。 または、テーブル変数を他のテーブルに結合するクエリの場合は、RECOMPILE ヒントを使用します。このヒントを使用すると、オプティマイザーがテーブル変数に適切な基数を使用するようになります。

扱うテーブルの大きさも考えてストアドプロシージャかユーザ定義関数か選ばないといけないことを知った。

不勉強のため調べないとわからないことが多い。SQL Server自習書読もう。