10

ストアド プロシージャでテーブル変数を使用すると、パフォーマンスの問題が発生します。

実際に何が起こるかは次のとおりです。

DECLARE @tblTemp TABLE(iId_company INT)

INSERT INTO @tblTemp(iId_company)
  SELECT id FROM .....

SELECT は 138 の結果を返しますが、TABLE 変数への挿入には 1min15 かかりますが、同じ SELECT で一時テーブルを使用すると、0 秒かかります。

CREATE TABLE #temp (iId_company INT)

INSERT INTO #temp(iId_company)
  SELECT id FROM ...

この動作の原因は何ですか?

4

4 に答える 4

10

一時テーブルを使用します。はるかに優れたパフォーマンスが表示されます。

この背後にある理由の詳細な説明は、最初の質問の範囲を超えていますが、要約すると次のようになります。

  • テーブル変数は、SQL Server によって 1 行に最適化されます。つまり、1 行が返されると想定されます。
  • テーブル変数は統計を作成しません。

Google一時テーブル対。豊富なリソースとディスカッションのためのテーブル変数。その後、特定の支援が必要な場合は、私に電子メールを送信するか、Twitter で連絡してください。

于 2009-10-29T13:26:24.070 に答える
0

一時テーブルに関する重要なポイントは、テーブル変数ではできないのに対し、テーブルにインデックスなどを配置できることです。

于 2009-10-29T22:15:52.617 に答える
0

一般に、データのセットが小さい場合、テーブル変数は一時テーブルよりも高速です。テーブル変数が並列処理をサポートしていないため、より大きなデータ セットの場合、パフォーマンスが低下します (この投稿を参照してください)。

そうは言っても、私は経験したことがないか、テーブル変数と一時テーブルでこのような小さなデータセットが遅くなるという経験を見つけませんでした。

于 2009-10-29T13:39:32.093 に答える
0

それは重要ではありませんが、あなたの選択はどのように見えますか? SQL Server 2005 で問題が発生しました。この問題では、選択自体が比較的高速に実行され、クエリが実行していたのは約 150,000 行のネットワーク経由ですべてのデータを返すのに 5 分かかりました。しかし、同じ選択を一時テーブルまたはテーブル変数に挿入しようとすると、ステートメントが 1 時間以上実行されてから、強制終了されました。実際に何が起こっていたのか、私はまだ把握していません。クエリヒントの強制順序を追加することになり、挿入が速くなりました。

于 2009-10-29T13:53:57.803 に答える