【发布时间】:2016-03-22 05:31:35
【问题描述】:
我有两个表a,b,主键是它们的索引。
要求:
如果@filter为空,则选择a、b的所有记录,否则将@filter按任意特定分隔符拆分,查找b.PKey在过滤器中的记录。
当前实施:
declare @filter nvarchar(max)= ''
SELECT *
FROM a
JOIN b ON a.PKey = b.aPKey
AND (@filter = '' OR b.PKey IN (SELECT item FROM splitFunction(@filter))
我发现最后一条语句and (@filter = '' or b.PKey in (select item from splitFunction(@filter))总是会导致对表b的表扫描,只有当我删除@filter=''时,它才会变为索引查找。
有什么方法可以实现我的要求并且不损害性能?
【问题讨论】:
-
@AbdulRasheed,谢谢,它有帮助,但似乎不是同一个问题。我的问题是连接条件
@filter=''导致表扫描。如果我删除它,将使用索引。 -
首先我建议您的
AND部分不是连接条件,而是WHERE条件。从功能上讲,将其置于 ON 或 WHERE 之间没有任何区别,但由于表达式未评估两个表之间的匹配,因此对我来说这是一个 where 条件。如果它是外连接会有所不同,但由于它是内连接,所以不会 -
您的实际问题可能是缓存的查询计划不正确或参数嗅探。如果您按照此处使用
OPTIMIZE FOR UNKNOWN,性能是否会提高:blogs.msdn.microsoft.com/sqlprogrammability/2008/11/26/…