You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何优化SQL Server中获取员工最新日期的T-SQL查询性能?

更高效的SQL实现方案

你的原方案虽然可行,但确实存在性能瓶颈——三次SELECT+UNION会对employee表执行三次全表扫描,且UNION默认的去重排序会进一步增加数据量大时的开销。以下是两种更高效的实现方式,均只需一次表扫描:

方法1:使用CROSS APPLY+VALUES构造日期集合取最大值

SELECT
    e.employee_id,
    e.name,
    MAX(d.date_val) AS most_recent_date
FROM employee e
CROSS APPLY (
    VALUES
        (e.hire_date),
        (e.termination_date),
        (e.rehire_date)
) d(date_val)
WHERE e.is_active = 1
GROUP BY e.employee_id, e.name

方法2:使用条件判断直接比较日期

如果不想使用CROSS APPLY,也可以通过嵌套IIF或CASE语句直接计算最大值:

SELECT
    employee_id,
    name,
    IIF(
        hire_date >= COALESCE(termination_date, '1900-01-01') 
        AND hire_date >= COALESCE(rehire_date, '1900-01-01'),
        hire_date,
        IIF(
            COALESCE(termination_date, '1900-01-01') >= COALESCE(rehire_date, '1900-01-01'),
            termination_date,
            rehire_date
        )
    ) AS most_recent_date
FROM employee
WHERE is_active = 1

性能优势说明

  • 两种优化方案均只需对employee表执行一次扫描,避免了原方案的三次重复扫描。
  • 无需UNION带来的排序去重操作,大幅降低CPU和IO开销,数据量越大性能提升越明显。
  • 自动处理NULL值:MAX函数会忽略NULL,COALESCE则为NULL日期设置一个极小值,不影响最大值计算。

内容的提问来源于stack exchange,提问作者MintBerryCRUNCH

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.04 23:40:24