SQL Server视图中实现字段计算是否有更优更快的方法?
SQL Server视图字段计算逻辑优化方案
方案1:使用CROSS APPLY复用计算逻辑(推荐)
该方案是SQL Server场景下的最优实现,公共分母逻辑仅对每行计算1次,完全避免重复计算开销,同时代码更简洁易读:
SELECT TCQ.Generic, TPM.WRITTEN_PRM / calc.GrossFactor AS Gross100_WRITTEN_PRM, TPM.EARNED_PRM / calc.GrossFactor AS Gross100_EARNED_PRM, TC.Generic = GS.Generic FROM -- 此处保留你原有的表关联逻辑 CROSS APPLY ( SELECT (100 - TPM.[CO-PART]) / 100.0 * ISNULL(TPM.Factor, 1) AS GrossFactor ) calc
优化说明:
- 用
ISNULL(TPM.Factor, 1)替代原有CASE WHEN判断,功能完全一致,写法更精简 - 公共分母逻辑封装在
CROSS APPLY中仅计算一次,两个结果字段直接复用返回值,无重复计算 - SQL Server查询优化器会自动内联该计算逻辑,不会产生额外的查询性能损耗
注意:原有代码如果
[CO-PART]、Factor均为整数类型,(100 - TPM.[CO-PART]) / 100会触发整数除法导致结果被截断出错,优化写法中将100改为100.0可避免该问题,若业务场景本身需要整数除法可改回100。
方案2:使用CTE(公共表表达式)实现
如果更习惯CTE写法也可以使用如下方式,性能和CROSS APPLY基本一致:
WITH base_calc AS ( SELECT TCQ.Generic, TPM.WRITTEN_PRM, TPM.EARNED_PRM, TC.Generic TC_Generic, GS.Generic GS_Generic, (100 - TPM.[CO-PART]) / 100.0 * ISNULL(TPM.Factor, 1) AS GrossFactor FROM -- 此处保留你原有的表关联逻辑 ) SELECT Generic, WRITTEN_PRM / GrossFactor AS Gross100_WRITTEN_PRM, EARNED_PRM / GrossFactor AS Gross100_EARNED_PRM, TC_Generic = GS_Generic FROM base_calc
内容的提问来源于stack exchange,提问作者Brian Battles
相关产品推荐
相关产品推荐

