如果在同一查询中使用相同的ROUND和/或SUM执行多少次

时间:2019-05-21 01:58:01

标签: sql sql-server sql-execution-plan

数据库-SQL Server 201x

下面的代码部分是从测试工具中提取的内容

我的问题是:在执行相同的 ROUND(SUM(...))节时,运行时有多聪明

它执行第一次出现并使用结果作为后续出现,还是执行多次?

在SQL Server中是否有更聪明的方法

select
    person.Name 'Name',
    account.AccountCode 'Account Code',
    ROUND(SUM(account.basevalue + account.accuredInteres), 2)    'Account Total'
    case 
        when ROUND(SUM(account.basevalue + account.accuredInteres), 2) =  ROUND(CAST(audit_data.total as decimal(21,6)), 2) then 'MATCH'
        when 
            ROUND(SUM(account.basevalue + account.accuredInteres), 2)  <= ROUND(CAST(audit_data.total as decimal(21,6)), 2) * 1.01 AND
            ROUND(SUM(faccount.basevalue + account.accuredInteres), 2)  >= ROUND(CAST(audit_data.total as decimal(21,6)), 2) * 0.99
            then 'IN TOLERENCE'
        else 'NOT MATCHING' END 'Values Equal ?'
from
    ----
    ----
where 
    ----

2 个答案:

答案 0 :(得分:3)

答案取决于执行计划。在这种情况下,我希望对结果集中的每一行执行round() 7次。但是,通常在聚合查询中,结果集要比初始数据小得多,因此这可能会增加查询的开销。

sum()是另一回事。它执行多少次并不重要。该操作最昂贵的部分是聚合,通常比单个聚合功能要复杂得多。

我不确定SQL Server是否优化多个sum(),但我怀疑它是否会对性能产生很大影响。

答案 1 :(得分:0)

唯一确定的方法是将计算所得的字段ROUND(SUM(account.basevalue + account.accuredInteres),2)作为纯字段,然后在外部sql select中进行所有比较,但这对所有情况都可能出现,可能不适合您的完整陈述。但是,您可以对大型数据集进行尝试,以查看计划和执行时间。我相信额外的费用将很小。