查询大型SQL Server表中最新版本的最快方法?

时间:2018-03-30 01:35:45

标签: sql version inner-join getlatest

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

我目前正在使用inner join方法,在非常大的SQL Server天气预报表中按日期,城市,小时,温度,UpdateTimestamp。为了获得最新的温度预测,我在日期,城市和小时+最大值(UpdateTimestamp)上使用inner join创建了一个视图,例如在其他posting中。

然而,随着数据集在原始表上的增长,视图查询会越来越慢。

不知道其他人是否遇到类似的情况,以及加快此查询的最佳方法是什么(我考虑的另一种解决方案是每天运行一个存储过程,创建一个单独的& #34;仅限最新版本"然后将非常快速地访问)。

编辑4/4 - 我发现目前为止最好的解决方案(感谢Vikram)是在3个字段中添加聚集索引到我的桌面" TSUnix"," CityId&# 34;," DTUnix",将性能提高约4倍(从25秒到4秒)

此外,我还尝试使用row_number解决方案(在查询示例下方),尽管看起来比“"内部连接”慢一点#34;做法。查询+索引创建都在下面:

索引创建:

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

谢谢!

1 个答案:

答案 0 :(得分:0)

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

使此速度快的特定索引是具有Date,City,Hour和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