1

使用 SQL Server 中的更新时间戳在大型 SQL 表上查询“最新版本”的最快方法是什么?

我目前正在使用这种inner join方法,按日期、城市、小时、温度、UpdateTimestamp 在非常大的 SQL Server 天气预报表上。为了获得最新的温度预测,我使用inner joinDate、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

谢谢!

4

1 回答 1

0

与索引一起使用ROW_NUMBER,如下所示。

使这一速度变快的特定索引是日期、城市、小时和 UpdateTimestamp 降序的索引。这需要对表进行一次传递,而不是 INNER JOIN 可能需要的多次传递。

工作代码:http ://sqlfiddle.com/#!18/8c0b4/1

SELECT Date, City, Hour, Temperature 
FROM
    (SELECT 
         Date, City, Hour, Temperature,
         ROW_NUMBER() OVER(PARTITION BY Date, City, Hour
                           ORDER BY UpdateTimestamp DESC) AS RowNumber
     FROM
         Test) AS t  
WHERE 
    t.RowNumber = 1
于 2018-03-30T06:27:04.177 回答