查询"最新版本"的最快方法是什么?在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
谢谢!
答案 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