我正在运行以下存储过程来添加合并复制连接过滤器,
sp_addmergefilter
该存储过程在幕后还做了什么?
我正在调用该存储过程,在一种情况下,它会在 10 分钟后超时。连接过滤器是针对 DispatchLink 和 Dispatch 两个表,
Dispatch.DispatchId = DispatchLink.DispatchLink1 and Dispatch.ContractId = DispatchLink.ContractLink1
or Dispatch.DispatchId = DispatchLink.DispatchLink2 and Dispatch.ContractId = DispatchLink.ContractLink2
这两个表的结构在这里解释,
如果我删除“或”之后的所有内容,它运行得很快。
我的发现真的很有趣。我以管理员身份启动 SSMS,并选择了调试存储过程的选项。我发现它是这样做的,
它这样做的原因似乎是为了测试 join 子句是否可行,即它是否有语法错误等。
结果查询计划是问题所在,可以在这里看到,
分析查询计划
添加 WITH (FORCESEEK) 使查询即时,但我当然不能这样做,因为这正是 sp_addmergefilter 在内部所做的。由于某种原因,查询优化器做出了错误的选择。