【发布时间】:2021-09-05 19:07:54
【问题描述】:
我经常处理时间序列并处理大量数据。数据位于 SQL Server 数据库中,并使用以下查询进行查询:
SELECT id, published_date, value_date, value
FROM timeseries t1
WHERE t1.id = 1011
AND t1.value_date BETWEEN '2017-01-07 00:00:00' AND '2019-09-15 15:00:00'
AND t1.published_date = (
SELECT MAX(t2.published_date)
FROM timeseries t2
WHERE t2.published_date <= '2019-09-21 23:59:59'
AND t2.id = t1.id
AND t2.value_date = t1.value_date
)
ORDER BY t1.value_date
上面的查询准确地返回了我需要的数据。事实上,该查询为我提供了给定时期的最后发布数据 (value_date)。但是,问题是如果周期变得非常大,查询需要很长时间。原因是该期间有几个出版物(published_date)。
我确定它与内部 SELECT 语句有关,因为它逐行搜索最大发布日期。我使用 JOIN 语句改进/加速查询的尝试没有奏效。
您将如何修改 SQL 查询?
非常感谢。
【问题讨论】:
-
在您检查了实际执行计划以了解如何访问数据以及为什么它“慢”之前,您不会做任何事情。 “周期变得非常大”究竟是什么意思?而这个
'2019-09-21 23:59:59'是一个等待被发现的逻辑错误——时间值可能不是您的数据类型的“最大”可能值。使用独占的边界。 -
您是否确定问题完全出在引擎内部,而不是您的结果集的消费者或网络传输?
-
是的,我很确定它与查询有关,与网络无关。我在 SQLite 中尝试了相同的查询并获得了大致相同的查询时间(当然具有相同的索引)。
-
@SMor 关于您的第一篇文章:您可能不了解 published_date 背后的逻辑。
标签: sql sql-server tsql join select