@table
構文は、テーブル変数 (tempdb
内の実際のテーブル) を作成します ) に結果を具体化します。
WITH
構文は、共通テーブル式
を定義します これは具体化されておらず、単なるインライン ビューです。
ほとんどの場合、2 番目のオプションを使用したほうがよいでしょう。これは関数内にあると述べています。これが TVF の場合、ほとんどの場合、これらを複数ステートメントではなくインラインにして、オプティマイザーによって展開できるようにする必要があります。これにより、テーブル変数の使用が即座に禁止されます。
ただし、場合によっては (基になるクエリが高価で、複数回実行されるのを避けたい場合など)、特定のケースで中間結果を具体化するとパフォーマンスが向上すると判断する場合があります。 現時点ではありません CTE に対してこれを強制する (少なくともプラン ガイドを強制することなく )
その場合、(一般に) 3 つのオプションがあります。 @tablevariable
、 #localtemp
テーブルと ##globaltemp
テーブル。ただし、関数内での使用が許可されるのは、これらの最初のものだけです。
テーブル変数と #temp テーブルの違いに関する詳細については、こちらをご覧ください .