【发布时间】:2020-11-24 06:54:02
【问题描述】:
我有这两个查询示例,差异很小,我认为这将是性能优化,但没有区别。小的变化是,在其中一个查询中,聚合中有条件逻辑,而在另一个查询中,我使用简单的数学来获得相同的结果。我原以为条件逻辑对于 RDMS 引擎来说比数学逻辑更难使用。但是它们显示了相同的计划和基本相同(我认为由于温暖的chache而略有变化)io统计和执行时间。
SELECT
fact_hourly.dim_timeseries_key,
fact_hourly.dim_date_key,
SUM(fact_hourly.energy) sum_energy,
SUM( IIF(load_type.is_power_demand_high_load_06_22=1,energy,0) ) sum_hl_energy,
fact_hourly.dim_sources_key
--@v_dss_update_time
FROM core.[fact_hourly] fact_hourly
LEFT JOIN core.[ds_hours_load_type] load_type
on load_type.dim_date_key = fact_hourly.dim_date_key
and load_type.hour_zero_indexed = DATEPART(HOUR,fact_hourly.value_timestamp)
WHERE fact_hourly.dim_timeseries_key = 727949
GROUP BY fact_hourly.dim_timeseries_key,fact_hourly.dim_date_key,fact_hourly.dim_sources_key
SELECT
fact_hourly.dim_timeseries_key,
fact_hourly.dim_date_key,
SUM(fact_hourly.energy) sum_energy,
SUM( energy*load_type.is_power_demand_high_load_06_22 ) sum_hl_energy,
fact_hourly.dim_sources_key
--@v_dss_update_time
FROM core.[fact_hourly] fact_hourly
LEFT JOIN core.[ds_hours_load_type] load_type
on load_type.dim_date_key = fact_hourly.dim_date_key
and load_type.hour_zero_indexed = DATEPART(HOUR,fact_hourly.value_timestamp)
WHERE fact_hourly.dim_timeseries_key = 727949
GROUP BY fact_hourly.dim_timeseries_key,fact_hourly.dim_date_key,fact_hourly.dim_sources_key
【问题讨论】:
-
如果要修复性能,可以将
DATEPART(HOUR,fact_hourly.value_timestamp)移动到计算列,并改用计算列。 -
如果你想比较数学和IIF之间的差异,你应该将鼠标悬停在执行计划中的运算符上并比较两个查询的数量。 (1 个执行计划的屏幕截图对此无济于事)。您可以与brentozar.com/pastetheplan 分享您的执行计划
-
如果你得到毫秒级的执行时间,查询性能真的是个大问题吗?
-
@AnnL.:以毫秒为单位的执行时间的原因是由于 timeseries_key 上的 where 子句条件。主要是为了快速得到结果,看看查询之间有没有大的不同。
-
@PrebenHuybrechts:我会试试你的建议,谢谢!这里还有两个执行计划的链接:brentozar.com/pastetheplan/?id=SyOEQB9Zvbrentozar.com/pastetheplan/?id=Hyk9XB9Zw
标签: sql sql-server sql-execution-plan