2009-10-29 18 views
9

ストアドプロシージャでテーブル変数を使用する際に、パフォーマンス上の問題が発生しています。ここテーブル変数SQL Serverストアドプロシージャの挿入時のパフォーマンスが悪い

は、実際に何が起こるかである:

DECLARE @tblTemp TABLE(iId_company INT) 

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

SELECT 138件の結果を返すが、テーブル変数に挿入すること1min15をとるが、私は同じSELECTで一時テーブルを使用する場合、woops、0秒を要する。

CREATE TABLE #temp (iId_company INT) 

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

何が問題を引き起こす可能性がありますか?

答えて

10

一時テーブルを使用します。パフォーマンスがはるかに向上します。しかし、要約する

この背後にある理由の詳細な説明は初期 質問の範囲を超えて:

  • それは1つの 行を前提とし、すなわち、テーブル変数は、SQL Serverによって、1つの 行のために最適化されています返されます。
  • テーブル変数は、 統計情報を作成しません。

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

0

通常、小さなデータセットの場合、テーブル変数は一時テーブルよりも速くなければなりません。大きなデータセットの場合、テーブル変数が並列性をサポートしないため、パフォーマンスが低下します(this post参照)。

このように、私は経験はありませんし、テーブル変数とテンポラリテーブルのような小さなデータセットでは経験が少ないと感じています。

0

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

0

一時テーブルについての重要な点は、テーブル変数ではできないのに対し、インデックスなどを置くことができることです。

関連する問題