数据库-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
----
答案 0 :(得分:3)
答案取决于执行计划。在这种情况下,我希望对结果集中的每一行执行round()
7次。但是,通常在聚合查询中,结果集要比初始数据小得多,因此这可能会增加查询的开销。
sum()
是另一回事。它执行多少次并不重要。该操作最昂贵的部分是聚合,通常比单个聚合功能要复杂得多。
我不确定SQL Server是否优化多个sum()
,但我怀疑它是否会对性能产生很大影响。
答案 1 :(得分:0)
唯一确定的方法是将计算所得的字段ROUND(SUM(account.basevalue + account.accuredInteres),2)作为纯字段,然后在外部sql select中进行所有比较,但这对所有情况都可能出现,可能不适合您的完整陈述。但是,您可以对大型数据集进行尝试,以查看计划和执行时间。我相信额外的费用将很小。