あなたが達成しようとしていることを理解しています。ようこそ、多種多様なデータベースの世界へ!
SQL Server 2000 は、グローバルにアクセス可能な一時テーブル (#MyLocalTable や ##MyGlobalTable など) に対して、テーブル名の前に # を付けてローカルでアクセス可能な (セッションに対してローカルな) 一時テーブルにし、テーブル名の前に ## を付けて作成された一時テーブルをサポートしています。それぞれ。
SQL Server 2005 以降では、一時テーブル (ローカル、グローバル) とテーブル変数の両方がサポートされています。SQL 2008 とリリース 2 のテーブル変数の新機能に注意してください! 一時テーブルとテーブル変数の違いはそれほど大きくはありませんが、データベース サーバーがそれらを処理する方法にあります。
7、6 のような古いバージョンの SQL サーバーについては話したくありませんが、私はそれらを使用しており、とにかくそれが私の出身地です :-)
テーブル変数は常にメモリ内にあると考えるのが一般的ですが、これは誤りです。メモリ使用量とデータベース サーバーのトランザクション量によっては、テーブル変数のページがメモリからエクスポートされて tempdb に書き込まれ、残りの処理がそこで (tempdb で) 行われる場合があります。
tempdb は、本質的に永続的なオブジェクトを持たないインスタンス上のデータベースですが、並べ替えなどのサイド トランザクションを含むワークロードや、本質的に一時的なその他の処理作業を処理する責任があることに注意してください。一方、テーブル変数 (通常は小さいデータを含む) はメモリ (RAM) に保持されるため、アクセスが高速化されるため、一時テーブルと比較して小さいデータを含むテーブル変数を使用する場合、tempdb ドライブを使用することでディスク IO が少なくなります。 tempdb にログインします。
テーブル変数にはインデックスを作成できませんが、一時テーブル (ローカルとグローバルの両方) にはインデックスを作成して、データ量が多い場合の処理を高速化できます。したがって、一時的なトランザクションによって大量のデータを高速処理する場合の選択がわかります。テーブル変数のみのトランザクションはログに記録されず、一時テーブルで行われたトランザクションはロールバックできますが、ロールバックできないことにも注意してください。
要約すると、テーブル変数は小さなデータに適していますが、一時テーブルは一時的に処理される大きなデータに適しています。トランザクション ブロックを使用した適切なトランザクション制御も必要な場合、テーブル変数はトランザクションをロールバックするためのオプションではないため、この場合は一時テーブルを使用することをお勧めします。
最後に、一時テーブルは常に tempdb を使用するため、ディスク IO は常に増加しますが、メモリ ストレス レベルによっては、テーブル変数はそれを増加させない場合があります。
tempdb を調整して 100% を超えるパフォーマンスを実現するためのヒントが必要な場合はお知らせください。