Slow Exists Checkの続編です。アレックスの提案はうまくいき、コードの繰り返しを避けることができますが、まだ2番目の問題に終わります。以下の例を考えてみましょう(AlexKuznetsovより)。その中には、1つの制約を扱う2つの枝があります。 2つのオプションの制約がある場合、私は4つのブランチで終わるだろう。基本的に、枝の数は制約の数とともに指数関数的に増加する。Where句での複数のオプション制約の効率的な処理
一方、複数値テーブル値関数を使用したり、一時テーブルを使用したりすると、SQLクエリオプティマイザが私を支援できないため、処理が遅くなります。私は動的SQLをやや不信に思っています(また、それも遅いと聞いてきました)。
多くのif文を追加しなくても、制約を追加する方法の提案はありますか?
注:私はこれまでにx is null or inpo = @inpo
を連鎖させてみましたが、これは非常に遅いです。 inpo = @inpo
テストはある種の索引付けブラックマジックで処理できますが、無効テストはテーブル内のすべての行について評価されることになります。
IF @inpo IS NULL BEGIN
SELECT a,b,c
FROM dbo.ReuseMyQuery(@i1)
ORDER BY c;
END ELSE BEGIN
SELECT a,b,c
FROM dbo.ReuseMyQuery(@i1)
WHERE inpo = @inpo
ORDER BY c;
END
バリエーション2:2つの制約:
IF @inpo IS NULL BEGIN
IF @inpo2 IS NULL BEGIN
SELECT a,b,c
FROM dbo.ReuseMyQuery(@i1)
ORDER BY c;
END ELSE BEGIN
SELECT a,b,c
FROM dbo.ReuseMyQuery(@i1)
WHERE inpo2 = @inpo2
ORDER BY c;
END
END ELSE BEGIN
IF @inpo2 IS NULL BEGIN
SELECT a,b,c
FROM dbo.ReuseMyQuery(@i1)
WHERE inpo = @inpo
ORDER BY c;
END ELSE BEGIN
SELECT a,b,c
FROM dbo.ReuseMyQuery(@i1)
WHERE inpo = @inpo AND
inpo2 = @inpo2
ORDER BY c;
END
END
偉大な発見。私の+1を取得します –
優秀なリファレンス+1 –