これはSQL Server 2008 R2に関する質問です。一時テーブルとサブセレクトのパフォーマンスが大きく異なる理由
私はDBAではありません。私はJava開発者で、時々SQLを書く必要があります。 (主にコードに埋め込まれています)。私はここで何か間違っているかどうかを知りたいのですが、もしそうなら、私はそれが再び起こるのを避けるために何ができるのですか。
Q1:
SELECT something FROM (SELECT * FROM T1 WHERE condition1) JOIN ...
Q1 14を備え
を結合Q2は1つの例外を除いて、Q1と同じです。 (SELECT * FROM T1 WHERE condition1)が実行され、一時表に格納されます。
これは相関サブクエリではありません。
Q2:再び
SELECT * INTO #tempTable FROM T1 WHERE condition1
SELECT something FROM #tempTable JOIN ...
、14が合流します。
Q2(両方のクエリを組み合わせた)が2秒かかっている間に、Q1が> 2分を要した(それを数回試して、役割を演じるのを避けるために)。何がありますか?
私の推測では、「SELECT * FROM T1 WHERE condition1'の推定行数は非常に不正確です。これを '#tempTable'に具体化すると、SQL Serverは返される行の数を正確に知ることができます。両方の実際の実行計画のXMLバージョンを投稿できますか? –