@table_variableまたは#temp_table


11

129列の大きなユーザー定義のテーブル型変数があります。このテーブル変数に一度に約2000〜3000個のレコードを格納し、それをさまざまなストアドプロシージャと関数に渡して、追加のデータを取得して変更を加えます。これらの追加データと新しい変更は、同じタイプの新しいテーブル変数に格納され、OUTPUTパラメーターを介してソースストアドプロシージャに返されます。(これは、テーブルタイプのパラメーターをとしてのみ渡すことができるためREADONLYです。)

これは私の疑似コードです:

  SP1
  @tmp tableType
  {
        INSERT @tmp EXEC
        SP2 (@tmp)

        INSERT @tmp EXEC
        SP3 (@tmp)
  }

@table_variableまたはを使用する必要があり#temp_tableますか?


回答:


12

あなたが見るべき2つのブログがあります。最初(ここ)は、テーブル変数と一時テーブルの比較です。これは2008年のものであり、SQL Server 2008 R2に引き続き関連しています。

2番目のブログエントリ(ここ)は、テーブル変数に関する誤解(見落とし)の一部を扱っています。テーブル変数のインデックス作成を含みます。

これらのブログエントリ、記事はどちらもGail Shawが作成しています。

探しているのは、一時変数をストアドプロシージャ間で渡すことができる一方で、テーブル変数をストアドプロシージャ間で渡せないことです。ストアドプロシージャ間で受け渡されるテーブル変数に最も近いのは、ユーザー定義のテーブルタイプです。

テーブル変数をTVPとしてストアドプロシージャに渡すには、READ-ONLYパラメータとして定義する必要があるという要件があります。これは、変更されたコピーを返したい場合、テーブル変数の複数のコピーが存在することを意味します。

言い渡されたとおり、ストアドプロシージャ間での受け渡しは、渡された構造体を更新された値で返したい場合に、Temp Tableを使用する方が適切な場合があります。


5

両方を試してみることほど良いことはありませんが、何百ものレコードにアクセスすると、#tempTablesのパフォーマンスが向上します。


3
それに加えて、一時テーブルはインデックスを持つことができ、統計を持つことができ、テーブル変数はPKしか持つことができないという事実を追加します。ここにいくつかの詳細があります
マリアン2011
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.