私は以下の問題があります。私はいくつかのフィルタを使用して非常に大きなテーブルを介してクエリを実行する必要があります。これらのフィルタは必須ではありません。つまり、クエリで特定のフィルタ(ColumnA以上)を使用する必要があり、時にはそうでない場合があります。これらのフィルターは、ストアード・プロシージャー(例:ColumnAの@filterA)にパラメーターとして渡されます。パフォーマンス:複数の条件付きWHERE句、または動的クエリ?
可能なフィルタがColumnA、ColumnB、ColumnCおよびColumnD(およびそれらをフィルタリングする値は@filterA、...、@filterD)であるとします。特定のフィルタを適用する必要がない場合、パラメータはNULLとして渡されます。現在、私が使用してこのような何かをやって考えている「条件付き」WHERE句:
SELECT *
FROM LargeTable
WHERE (@filterA IS NULL OR ColumnA = @filterA)
AND (@filterB IS NULL OR ColumnB = @filterB)
AND (@filterC IS NULL OR ColumnC = @filterC)
AND (@filterD IS NULL OR ColumnD = @filterD)
これは1つの可能性であるが、私はそれは私がすべての中でこれらすべてのWHERE句を適用することになることを考えると、どのようにパフォーマンスの高いだろう大文字と小文字の区別があります。
私は実際ににを使用する必要がある場合にのみ、特定のWHERE句を適用する動的クエリを使用することをお勧めしますか?このようなもの:
DECLARE @query varchar(MAX)
SET @query = 'SELECT * FROM LargeTable WHERE ';
IF @filterA IS NOT NULL
BEGIN
SET @query = CONCAT(@query, 'ColumnA = ', @filterA)
END
IF @filterB IS NOT NULL
BEGIN
SET @query = CONCAT(@query, 'AND ColumnB = ', @filterB')
END
IF @filterC IS NOT NULL
BEGIN
SET @query = CONCAT(@query, 'AND ColumnC = ', @filterC')
END
IF @filterD IS NOT NULL
BEGIN
SET @query = CONCAT(@query, 'AND ColumnD = ', @filterD')
END
EXEC sp_executesql @query
どのようなオプションが良いですか?基本的に「WHERE true」を実行しているとき、WHERE句はここでパフォーマンスにどのように影響しますか?動的クエリはパフォーマンス上のペナルティを伴いますか?
おかげ
列に索引がある場合は、索引を利用できるため、動的SQLが優れています。 –
http://sqlmag.com/database-performance-tuning/don-t-fear-dynamic-sql – granadaCoder
私が「恐れてはいけない」というURLを残している間、私は動的SQLを嫌います。それは滑りやすい斜面であり、維持の悪夢です。最終的には、両方をセットアップしてテストします。インデックスは一つのことです。計画再利用は別のものです(記事を読んでください)。あなたが動的になるなら、あなたがなぜそれを選んだのかコメントしてください。 – granadaCoder