Sql server 我希望以一种更可取的方式来说明这一条件

Sql server 我希望以一种更可取的方式来说明这一条件,sql-server,performance,tsql,sql-server-2017,Sql Server,Performance,Tsql,Sql Server 2017,在我的sql server 2017标准CU 20中,有一个经常执行的查询具有以下可怕的条件: AND F.progressive_invoice % @numberofservicesInstalled = @idService 有没有一种数学方法可以让sql server更方便地使用它 查询持续时间为240到500毫秒 你能帮我做得更好吗?请你认为这里什么特别糟糕 这个查询执行得不好吗?你确定是这种情况造成的吗 此%是最新版本 --这与您的代码所做的大致相同: DECLARE @Divis

在我的sql server 2017标准CU 20中,有一个经常执行的查询具有以下可怕的条件:

AND F.progressive_invoice % @numberofservicesInstalled = @idService
有没有一种数学方法可以让sql server更方便地使用它

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

你认为这里什么特别糟糕

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

%
是最新版本

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

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.invoice
和变量
@numberofservicesInstalled
的整数除法,然后选择余数。将此计算结果与变量
@idService
进行比较

由于必须对每个值进行计算,因此索引在这里没有帮助

我不认为,这可以放得更容易

更新

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

我试着去想这个的意义。。。服务的编号(或者如变量所示,其
id
)是否以某种方式隐藏在发票编号中

执行计划和行估算:

引擎将看到,必须为所有行计算该值。在您必须执行此操作之前,强制执行任何其他筛选器。但你表现得不够好。我们看到的代码行只是条件的一部分


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

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

可能足以将所有操作放在等式的右边(=),查询计划高估了很多在这种情况下返回的值,也许如果你能把操作放在=操作符的右边,结果会更好。查询是由程序员继承的,幸运的是它在一个存储过程中,但我不能确切地理解它的用途。这是解释的字段:F.progressive\u invoice是发票上的累进数字,numberofservicesInstalled是客户端上的服务数量,idService是服务的id。明天我可以与您共享plan@GabrieleD奥努弗里奥“进步”到底是什么意思?@idService的最大值是多少?@numberofservicesInstalled的最大值是多少?看起来在一列中隐藏两个值是一种奇怪的方式…@GabrieleD'Onufrio,这是一种将我想要的服务*编码到发票号中的奇怪方式,不是吗?
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;