如何优化此查询:
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 分钟。
我相信这是因为它正在扫描 aMassiveSlowTable,而它所要做的就是匹配 MyParam = @MyParam。
如果@MyParam 与 MyParam 匹配,如何让它跳过所有其他比较?我尝试使用 CASE 语句,但它们不适用于IN子句。我尝试重新排列括号中的 AND,甚至向aMassiveSlowTable添加额外的过滤。
如果@MyParam 与MyParam 不匹配,则查询需要更长的时间也没关系。