試してください:
;with CTE_AorB
(
select * from table_A WHERE (condition true)
union all
select * from table_B WHERE NOT (condition true)
),
CTE_C as
(
select * from CTE_AorB // processing is removed
)
動的検索条件の鍵は、インデックスが使用されていることを確認することです。このトピックの処理方法に関する非常に包括的な記事は次のとおりです:
Erland Sommarskog による T-SQL の動的検索条件
複数のオプションの検索条件を使用してクエリを作成しようとするすべての問題と方法をカバーしています。この主な注意事項は、コードの重複ではなく、インデックスの使用です。クエリがインデックスの使用に失敗すると、パフォーマンスが低下します。使用できる手法がいくつかありますが、インデックスの使用が許可される場合と許可されない場合があります。
目次はこちら:
Introduction The Case Study: Searching Orders The Northgale Database Dynamic SQL Introduction Using sp_executesql Using the CLR Using EXEC() When Caching Is Not Really What You Want Static SQL Introduction x = @x OR @x IS NULL Using IF statements Umachandar's Bag of Tricks Using Temp Tables x = @x AND @x IS NOT NULL Handling Complex Conditions Hybrid Solutions – Using both Static and Dynamic SQL Using Views Using Inline Table Functions Conclusion Feedback and Acknowledgements Revision History
適切なバージョンの SQL Server 2008 を使用している場合は、使用できる追加の手法があります。次を参照してください。 SQL 2008 用 T-SQL バージョンの動的検索条件 (SP1 CU5 以降)
SQL Server 2008 の適切なリリースを使用している場合は、OPTION (RECOMPILE)
を追加するだけです。 クエリに追加され、実行時のローカル変数の値が最適化に使用されます。
これを考慮してください、OPTION (RECOMPILE)
このコードを使用します (この混乱した OR
ではインデックスを使用できません) s):
WHERE
(@search1 IS NULL or [email protected])
AND (@search2 IS NULL or [email protected])
AND (@search3 IS NULL or [email protected])
実行時に次のように最適化します (@Search2 のみが値とともに渡された場合):
WHERE
[email protected]
インデックスを使用できます (Column2 に定義されている場合)