使用 SQL Server 中的更新时间戳在大型 SQL 表上查询“最新版本”的最快方法是什么?
我目前正在使用这种inner join
方法,按日期、城市、小时、温度、UpdateTimestamp 在非常大的 SQL Server 天气预报表上。为了获得最新的温度预测,我使用inner join
Date、City 和 Hour + max(UpdateTimestamp) 创建了一个视图,例如在 this other张贴中。
然而,随着数据集在原始表上的增长,视图查询随着时间的推移变得越来越慢。
想知道其他人是否遇到过类似的情况,以及加快此查询的最佳方法是什么(我正在考虑的一个替代解决方案是每天运行一个存储过程,仅创建一个单独的“最新版本”表,然后将是访问速度非常快)。
编辑 4/4 - 到目前为止,我发现最好的解决方案(感谢 Vikram)是在“TSUnix”、“CityId”、“DTUnix” 3 个字段的表中添加一个聚集索引,这将性能提高了 ~4 倍(从 25 秒到 4 秒)
我也尝试使用 row_number 解决方案(下面的查询示例),虽然看起来比“内部连接”方法慢一些。两个查询+索引创建如下:
索引创建:
USE [<My DB>]
GO
CREATE NONCLUSTERED INDEX [index_WeatherForecastData]
ON [dbo].[<WeatherForecastData>] ([TSUnix], [CityId], [DTUnix])
INCLUDE ([Temperature], [TemperatureMin], [TemperatureMax], [Humidity], [WindSpeed], [Rain], [Snow])
GO
询问:
-- Inner Join Version
SELECT W.TSUnix, W.CityId, W.DTUnix, W.Temperature, W.*
FROM WeatherForecastData W
INNER JOIN (
SELECT max(TSUnix) Latest, CityId, DTUnix
FROM WeatherForecastData
GROUP BY CityId, DTUnix
) L
ON L.Latest = W.TSUnix
AND L.CityID = W.CityID
AND L.DTUnix = W.DTUnix
-- Row Number Version
SELECT W.TSUnix, W.CityId, W.DTUnix, W.Temperature, W.*
FROM
(
select
*, ROW_NUMBER() over (partition by DTUnix, CityId order by TSUnix desc) as RowNumber
from WeatherForecastData
) W
WHERE
W.RowNumber = 1
谢谢!