次のような大きなテーブルに対するクエリがあります。
declare @myIdParam int = 1
select *
from myTable
where (@myIdParam is null or myTable.Id = @myIdParam)
where句には、このような同様の条件がいくつかあり、結合も多数ありますが、これは要約です。
事実上、@ myIdParamがnullの場合、このパラメーターを使用して結果を制限する必要はありません。
私はDBプロではありませんが、私のテストから、このNULLチェックはすべてのレコードに対して行われ、どのような方法でも最適化されていないようです。
nullチェックを削除し、パラメーターがnullではないと想定すると、クエリは即座に返されます。それ以外の場合は、最大10秒かかります。
これを最適化する方法があるので、チェックは実行時に一度だけ行われますか?
@vercelliこれはトリックを行います。この質問は本当にオプションのパラメーターに関するものであることを考えると、リンクしたものの複製だと思います。
—
Mystagogue
おそらく、それは6年前からの投稿です。SqlServer 2014または2016では、新しいアプローチがあるかもしれません。(私は2014年に再コンパイルせずにテストし、永遠に
—
費やしました
実際のクエリには多くのオプションパラメータがあるため、動的SQLが最高のパフォーマンスを提供します。この件に関する詳細な記事については、sommarskog.se / dyn-search.htmlを参照してください。
—
Dan Guzman、
リンクされた質問vercelliで概説されているようにWITH RECOMPILEを使用する@DanGuzmanは、クエリ時間を1分足らずから非常に選択的な基準で実際に瞬時に短縮しました。これは、パフォーマンスと読みやすさのバランスをとるための最良のオプションと考えています。
—
Mystagogue
OPTION(RECOMPILE)