2017-03-13 44 views
1

パフォーマンスを向上させるために、例外のないすべてのサブクエリが一時テーブルで書き換えられたソリューション(SQL Serverの場合)に取り組んでいます。すべてのサブクエリを一時テーブルに置き換える必要がありますか?

例を与えるために、このようなすべてのクエリ:

SELECT something 
FROM (SELECT * FROM T1 WHERE condition1) 
JOIN ... 

はこのように書き換えされています:

SELECT * 
INTO #tempTable 
FROM T1 
WHERE condition1 

SELECT something 
FROM #tempTable 
JOIN ... 

また、すべてのサブクエリは避けるべきであることをhereが示唆されていますテンポラリテーブルを利用しています。

与えられた事実に基づいて、すべてのサブクエリを一時テーブルに置き換える必要がありますか?どちらか一方を他方よりも考慮する必要がある場合は、

+0

これはすでにここに答えた:
はhttp://stackoverflow.com/questions/16767645/why-is-there-a-huge-performance-difference-between-temp-table-and-subselectと、この:
http://stackoverflow.com/questions/2825342/why-would-using-a-temp-table-be-faster-than-a-nested-query –

+3

SQL Serverの例外ルールを使用しない絶対的な唯一の方法は、「it依存する "。私は、すべてのサブクエリを暫定的に盲目的に臨時テーブルにすることは、無駄と不満の練習であることを強く主張します。場合によってはパフォーマンスが向上する場合もありますが、他の場合は悪化する可能性があります。 100万行のサブクエリを考えてみましょう。これは、多くのデータをテンポラリテーブルにコピーするコードを書き込むための素晴らしい方法ではないかもしれませんが、遅くなるでしょう。そして、せいぜいあなたは存在していないパフォーマンス問題を「修正」しているかもしれません。 –

+1

これはあなたが探している答えのほとんどです:http://stackoverflow.com/a/11169910/2333499 – SqlZim

答えて

6

これはばかげています。ジョーク。

"サブクエリ"はそのままです。 SQL Serverはそれを無視します。あなたはとしてそれを書き換えることができます:

SELECT something 
FROM T1 JOIN . . . 
WHERE condition1 

SQL Serverが正しく、これを最適化する必要があります。

私の経験では、クエリを最適化するために一時テーブルを作成する必要がほとんどありません。もう少し頻繁に、私はネストされたループの結合を避けるためにクエリのヒントを使用します。

テンポラリテーブルが必要な場合、ほとんどの場合、テーブルにインデックスがあります。これが一時表を使用する主な理由の1つです。 (他の2つは同じクエリーブロックが1つのクエリーまたは複数のクエリーで繰り返されるためです)。

+0

あなたはポイントがありません。 OPが与えたリンクを読んでください。 –

+0

@SqlZimが提供した素晴らしいリンクもあります - 「テンポラリ・テーブルは別の問題です。なぜなら、クエリをどのように実行するかについてより多くのガイダンスを提供しているからです。これにより、パフォーマンスが向上する可能性があります。答えは... mmm ... –

+0

@DuduMarkovitz SqlZimのリンクはGordonからの回答です。 – scsimon

関連する問題