9

違いは何ですか:

CREATE TABLE #temp ( [ID] INT)

INSERT INTO #temp
SELECT ...

DECLARE @temp TABLE ( [ID] INT)

INSERT @temp
SELECT ...

SQL Server 2008では?

4

4 に答える 4

12

一時テーブルは、現在のデータベースではなくTempDBに入り、限定されたスコープの後に消えることを除いて、ほとんどの特性で通常のテーブルに似ています(セッションベースかグローバル一時テーブルかによって異なります。ただし、一時テーブルのデータに対するすべての変更はトランザクションログに記録され、それに伴うすべてのパフォーマンスへの影響があります。otoh、通常のテーブルとまったく同じように、一時テーブルに必要な数のインデックス、ビュー、トリガー、またはその他のものを追加することもできます。

テーブル変数は、一種のショートカットインメモリテーブルです(一時DBも使用します)。それらへの変更はログに記録されません(これによりパフォーマンスが向上します)。ただし、それらのインデックスは1つしか取得できません(最初の宣言ステートメントの後にインデックスを作成できないため、テーブル変数に作成できるインデックスは、最初のテーブル変数宣言に含めることができるインデックスのみです...

   Declare @Tab Table (myKey integer Primary Key Not Null, data varchar(20)) 

これらの特性のため、一時テーブルは大きなテーブル(幅が広く行が多い)や、存続期間中に複数のアクセスパターンが発生するテーブルに適していますが、テーブル変数は非常に狭いテーブルが必要な場合に最適です(キーのみのテーブル、またはデータ列が1つしかないキー)。これは、常にそのインデックス付きキーによってアクセスされます。

于 2009-10-20T21:17:05.997 に答える
5

これは、さまざまな一時テーブルに関するかなり良いリファレンスです。

一時テーブルと変数

于 2009-10-20T21:13:10.410 に答える
1
  1. テーブル変数のログはありません
  2. テーブル変数にはローカルスコープのみがあります(異なるプロシージャから同じテーブル変数にアクセスすることはできません)
  3. 一時テーブルを含むプロシージャはプリコンパイルできません

詳細については、このトピックを参照してください。

于 2009-10-20T21:13:22.867 に答える
1
  1. テーブル変数には明確に定義されたスコープがあります。それらはバッチ(つまり、ステートメントの現在のバッチ)の最後に自動的にクリアされますが、一時テーブルは現在のセッションとネストされたストアドプロシージャに表示されます。グローバル一時テーブルは、すべてのセッションに表示されます。

  2. テーブル変数は、Declareステートメントを使用して作成されます。ステートメントを使用してテーブル変数を作成することはできません

    select * into @tableVariableName
    

    ただし、Createtableステートメントとステートメントを使用して一時テーブルを作成できます。

    select * into #tempTableName
    
  3. SQL Server 2008以降では、テーブル変数をパラメーターとしてストアドプロシージャに渡すことができます。ただし、一時テーブルをパラメータとしてストアドプロシージャに渡すことはできません。

  4. UDF(ユーザー定義関数)内でテーブル変数を使用することはできますが、UDF内で一時テーブルを使用することはできません。

于 2013-03-28T16:02:17.623 に答える