2010-11-30 11 views
2

冗長クエリブロックを使用するクエリの速度を最適化しようとしています。私はSQL Server 2008の下のクエリを使用して行ごとに参加しようとしています。私たちは同じ円柱のデータを取得するために、複数の異なるテーブルでそれに参加する必要がある以外selectサブクエリ/結果の再発行

Select * from 
(<complex subquery>) cq 
join table1 t1 on (cq.id=t1.id) 
union 
Select * from 
<complex subquery> cq 
join table2 t2 on (cq.id=t2.id) 

<complex subquery>はまさに労働組合サブクエリ片の両方で同じです。

結果をキャッシュするために一時テーブルを使用せずにクエリを書き直す方法がありますか?

+2

おそらくCTEですか? Googleのために、それがあなたのニーズを満たすかどうかを確認してください。 – leppie

+1

@leppie - CTEは、ここで説明したプランガイドを使用せずに結果を一般化しませんhttp://explainextended.com/2009/05/28/generating-xml-in-subqueries/ –

答えて

3

一時テーブルを使用して、実行統計を改善するのはなぜですか。

状況によっては、クエリオプティマイザがサブクエリをキャッシュするプランにスプールを自動的に追加しますが、これは基本的には一時テーブルです。

現在の計画をチェックして、クエリが実際に複数回評価されていることを確認しましたか?

+0

一時テーブルは、 tempdbをゴミ箱に入れないようにしなければならないかもしれませんが、DBの残りの部分は遅くなります。 –

+0

上記のクエリは検索ボックスで使用されます。つまり、現在のユーザー負荷では、このクエリは1秒あたり100〜1000回実行されます。tempDbで処理できると思いますか? – Mulki

1

具体例がないとそれは役立ちますが、WITHステートメントを試す、のような何かすることは困難です。

WITH csq(x,y,z) AS (
    <complex subquery> 
) 
Select * from 
csq 
join table1 t1 on (cq.id=t1.id) 
union 
Select * from 
csq 
join table2 t2 on (cq.id=t2.id) 

それは時々終わり

0

を物事をスピードアップしていないクエリの性質は、あなたが反転することができませんそれ? "(join、join)union"の代わりに "(union)join"を実行しますか? Like:

Select * from 
(<complex subquery>) cq 
join (
    Select * from table1 t1 
    union 
    Select * from table2 t2 
) ts 
on cq.id=ts.id 

複雑なクエリの二重評価が実際に間違っているかどうかはわかりません。しかし、あなたの質問によると、これはSQLが<complex query>を一度だけ評価するように促すクエリの形式になります。

+0

残念ながら...複雑なクエリの結果は、両方のsql unionスニペットで必要です....とはい、私は複雑なサブクエリの複数の評価を避けようとしています – Mulki

関連する問題