このクエリを最適化するにはどうすればよいですか:
declare @MyParam nvarchar(100) = 25846987;
select top 100 * from MySelectTable
where
(MyParam = @MyParam)
OR
(@MyParam = 0 and MyParam in (SELECT MyParam FROM aMassiveSlowTable WHERE Id = 'random1'))
OR
(@MyParam = 1 and MyParam in (SELECT MyParam FROM aMassiveSlowTable WHERE Id = 'random2'))
OR
(@MyParam = 2 and MyParam in (SELECT MyParam FROM aMassiveSlowTable WHERE Id = 'random3'))
この部分だけを使用する場合:
declare @MyParam nvarchar(100) = 25846987;
select top 100 * from MySelectTable
where
(MyParam = @MyParam)
1秒で戻ります。
すべてのパラメータを使用すると、約 5 分かかります。
MyParam = @MyParam に一致させるだけでよい場合に、aMassiveSlowTable をスキャンしているためだと思います。
@MyParam が MyParam と一致する場合、他のすべての比較をスキップするにはどうすればよいですか? CASE ステートメントを使用してみましたが、 IN句では機能しません。括弧内の AND を再配置し、追加のフィルタリングをaMassiveSlowTableに追加しようとしました。
@MyParam が MyParam と一致しない場合は、クエリがもう少し長くても問題ありません。