我希望以一种更可攻击的方式来表达这个条件

I wish to put this condition in a more sargable way

在我的 sql 服务器 2017 标准 CU 20 中,有一个非常经常执行的查询具有这种糟糕的情况:

AND F.progressive_invoice % @numberofservicesInstalled = @idService

有没有一种数学方法可以让 sql 服务器更方便地使用它?

查询持续 240 到 500 毫秒 你能帮我做得更好吗?请

你觉得这里有什么地方特别难看

这个查询执行得不好吗?您确定是这种情况造成的吗?

这个%就是modulo operator

SELECT  13 % 5 => Remainder is 3

--这与您的代码大致相同:

DECLARE @Divisor INT=5; --Switch this value
DECLARE @CompareRemainder INT=3;
SELECT CASE WHEN 13 % @Divisor = @CompareRemainder THEN 'Remainder matches variable' ELSE 'no match' END;

您的代码行将告诉引擎计算 F.progressive_invoice 和变量 @numberofservicesInstalled 的整数除法,然后取余数。此计算的结果与变量 @idService.

进行比较

由于必须对每个值进行此计算,因此索引在这里无济于事...

我不认为,这可以更有效

更新

在您建议的评论中,它可能有助于更改等于运算符后面 的代码。不,这没有用。

我试图想出一个有意义的含义...是服务的编号(或者 - 正如变量所暗示的那样 - 它的 id)不知何故隐藏在发票号码中?

执行计划和行估计:

引擎会看到,必须对所有行进行计算。在您必须执行此操作之前强制执行任何其他过滤器将有助于。但你表现得还不够。我们看到的这行代码只是条件的一部分...

索引和统计数据肯定也会发挥作用...

您的直接问题的简短回答是否定的。您不能重新排列此表达式以使其成为可搜索谓词。至少,不是使用有限且不可知@numberofservicesinstalled 的可能值的结构。