2016-08-12 18 views
3

私は以下の問題があります。私はいくつかのフィルタを使用して非常に大きなテーブルを介してクエリを実行する必要があります。これらのフィルタは必須ではありません。つまり、クエリで特定のフィルタ(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句はここでパフォーマンスにどのように影響しますか?動的クエリはパフォーマンス上のペナルティを伴いますか?

おかげ

+1

列に索引がある場合は、索引を利用できるため、動的SQLが優れています。 –

+1

http://sqlmag.com/database-performance-tuning/don-t-fear-dynamic-sql – granadaCoder

+0

私が「恐れてはいけない」というURLを残している間、私は動的SQLを嫌います。それは滑りやすい斜面であり、維持の悪夢です。最終的には、両方をセットアップしてテストします。インデックスは一つのことです。計画再利用は別のものです(記事を読んでください)。あなたが動的になるなら、あなたがなぜそれを選んだのかコメントしてください。 – granadaCoder

答えて

2

良いオプションは何ですか?

あなたの場合、私は動的SQLを好むでしょう。

WHERE trueを基本的に実行しているときにWHEREの句がパフォーマンスにどのように影響しますか?

where句のすべての条件は、パラメータを指定するかどうかにかかわらず、各行ごとに評価されます。

パフォーマンスクエリにはパフォーマンスペナルティがありますか?

フィルタリング列にインデックスがある場合は、ダイナミックが優れたパフォーマンスを示します。

関連する問題