【发布时间】:2020-05-12 18:59:49
【问题描述】:
我有 Microsoft SQL Server 2008 和一个包含如下数据的表:
id | file_date [datatime] | file_path [varchar(255)]
____________________________________________________
1 | 01-01-1999 | C:\f1.txt
2 | 01-01-2020 | C:\f2.txt
3 | 05-05-1999 | C:\f3.txt
4 | 05-05-2020 | C:\f3.txt
5 | 05-05-1999 | C:\f4.txt
6 | 06-05-1999 | C:\f4.txt
我需要选择所有 file_paths,其中 file_date 是旧的,并且没有其他具有此 file_path 的行具有较新的 file_date强>存在
例如,如果我必须获取日期早于 2019 年的行,我的结果应该是这样的:
file_path
C:\f1.txt
C:\f4.txt
我有一个解决方案:
SELECT rslt.file_path
FROM mytable rslt
GROUP BY rslt.file_path
HAVING MAX(rslt.file_date) < '2019-01-01'
问题是这个脚本需要大约 2 分钟才能返回一个表中的大约 62k 行,其中我有 4460 万行,而简单的脚本来获取所有早于日期的行(见下文)需要 2-3秒
SELECT * FROM mytable WHERE file_date < '2019-01-01'
那么,有什么办法可以优化我的解决方案吗?
【问题讨论】:
标签: sql sql-server sql-server-2008