我们有许多“搜索存储过程”,它们采用多个可为空的参数来搜索不同表中的数据行。它们通常是这样构建的:
SELECT *
FROM Table1 T1
INNER JOIN Table2 T2
ON T2.something = T1.something
WHERE (@parameter1 IS NULL OR T1.Column1 = @parameter1)
AND (@parameter2 IS NULL OR T2.Column2 = @parameter2)
AND (@parameter3 IS NULL OR T1.Column3 LIKE '%' + @parameter3 + '%')
AND (@parameter4 IS NULL OR T2.Column4 LIKE '%' + @parameter4 + '%')
AND (@parameter5 IS NULL OR T1.Column5 = @parameter5)
这最多可以处理 30-40 个参数,我们注意到,即使只提供了 parameter1,执行计划也会对其他表进行索引扫描,这会显着降低查询速度(几秒钟)。测试告诉我们,只保留 WHERE 语句的第一行可以使查询即时。
我已经读到shortcuiting 是不可能的,但是是否有解决方法或方法来构建可能更有效的查询?
我们目前通过使用相同 SELECT/FROM/JOINS 的不同版本但在 WHERE 子句中使用不同的参数集来解决这个问题,并且根据传递的参数,我们选择要执行的正确选择语句。这是漫长、混乱且难以维护的。