質問

私はコンパイル時にUNIONで2つのクエリに自分自身を分割するWHERE句にORを使用するクエリを取得できますか?私は手動でそれを書き換えた場合、それが効果的に労働組合の各クエリで異なるインデックスを使用することができますので、UNIONを使用してクエリは、単一のクエリよりも100倍高速です。私は、オプティマイザは、このアプローチを使用することができます任意の方法はありますか?

私はこのようになりますクエリを持っています:

select columnlist
from table1
join table2 on joincond2
join table3 on joincond3
where conditions1 
    and ((@param1 is null and cond3a) or (cond3b))

どこcolumnlistの、joincond2、joincond3、及び条件1は、すべての長い式です。キッカーはORで条件の一つだけが今まで真実であるということです。

私が最初に私は労働組合を行うには、それを書き換えることができると思ったが、その後、私は将来的には、メンテナンスの多くを必要とする場合がありますSQLの20かそこらの行ですcolumnlistの、joincond2、joincond3、及び条件1を繰り返しています。私が供給できるヒントまたはWHERE句を記述するためにいくつかのより良い方法はありますか?事前に感謝します。

役に立ちましたか?

解決

あなたができるグループ

select columnlist
from table1
join table2 on joincond2
join table3 on joincond3

ビューにして、労働組合を使用します。

しかし、あなたはSQL2005 / 8に移行することができれば、 あなたは、共通テーブル式を使用することができます。

with cte ( columnlist )
as (
    select columnlist
    from table1
    join table2 on joincond2
    join table3 on joincond3 )
select columnlist from cte where ...
union
select columnlist from cte where ...

他のヒント

クエリにOPTION(RECOMPILE)を追加してみてください。それは、ストアドプロシージャにありますならば、同様にそのにWITH RECOMPILEを追加します。それはあなたのクエリのSQL Serverを実行する最初の時間は、計画を思い付くし、それをキャッシュしますが、それを介して第2の時間はまだ古い(現在は貧しい)クエリプランを使っていることもあります。

それはあなたがクエリを使用するたびに再コンパイルする必要がありますので、あなたがマイナーな打撃を受けるだろうが、それは貧しい人々の計画の使用と比較して非常に小さいされます。

編集:私はSQL 2000でストアドプロシージャにWITH RECOMPILEを使用すると、常に正常に動作しないことを読みました。バグはおそらく私も個人的にバグに遭遇したことがありませんので、私は、正確な取引がそれであるかわからないSQL 2005で修正されました。しかし、それを試してみてください。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top