SQL Server 表的基本索引策略

问题描述 投票:0回答:1

假设我有一个表,其中包含未来 10 年每一天的预测气温,并且我每天都会重新计算这些预测。

Forecast
桌子

身份证 计算日期 日历日 位置ID 温度
999 2024 年 1 月 5 日 2033 年 9 月 10 日 55 98
998 2024 年 1 月 5 日 2033 年 9 月 6 日 55 99
997 2024 年 1 月 5 日 2033 年 9 月 5 日 55 102
996 2024 年 1 月 5 日 2033 年 9 月 4 日 55 98
... ... ... ... ...
400 2024 年 1 月 4 日 2033 年 9 月 6 日 55 97
399 2024 年 1 月 4 日 2033 年 9 月 5 日 55 99
398 2024 年 1 月 4 日 2033 年 9 月 3 日 55 102
397 2024 年 1 月 4 日 2033 年 9 月 2 日 55 97

注意:日历日之间有间隙,有时重新计算日期会失败,所以我们不保存它

如果我使用这些数据的唯一目标是能够提供特定位置/日期的最新(表面上是最准确的)计算温度,那么创建聚集索引的正确方法是什么?

具有

DateCalculated desc
CalendarDay desc
LocationId desc
的聚集索引是正确的方法吗?

查询示例:

    Select top 1
       Temperature 
    From
       Forecasts
    Where LocationId = 55 and CalendarDay = '1/7/2025'
    OrderBy DateCalculated desc

阅读 Microsoft 文档,它提到聚集索引对于宽键来说并不是一个好的选择,它定义为:

宽键是几个列或几个大尺寸列的组合[...]

我不太清楚我提议的 DateCalculated、CalendarDay、LocationId 复合键是否会被视为宽键。

sql sql-server
1个回答
0
投票

不,这是一个坏索引,但不是因为宽键。它没有那么宽,如果查询需要它那么它就是必要的。宽密钥可能有很多字节,超过 32 个字节是一个可能的经验法则。

问题是这个索引对你没有帮助。您需要首先放置等式谓词列,然后放置不等式/连接/排序列。

最好的索引是:

(LocationId, CalendarDay, DateCalculated DESC) INCLUDE (Temperature)
或者:

(CalendarDay, LocationId, DateCalculated DESC) INCLUDE (Temperature)
因此,前两列可以按任意顺序排列(升序或降序),尽管您可能想查看其他查询需要什么,因为它们可能使用其中一列作为不等式或连接谓词,或者作为排序专栏。

另请注意添加了

INCLUDE

,这样您就不需要对 
Temperature
 列进行键查找。考虑将此索引设为聚集索引,然后自动包含所有其他列。您甚至可以将这三列设为主键并删除不必要的 
Id
 列。

© www.soinside.com 2019 - 2024. All rights reserved.