我希望以一种更可攻击的方式来表达这个条件
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 的可能值的结构。
在我的 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 的可能值的结构。