假设我有一个表,其中包含未来 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 复合键是否会被视为宽键。
不,这是一个坏索引,但不是因为宽键。它没有那么宽,如果查询需要它那么它就是必要的。宽密钥可能有很多字节,超过 32 个字节是一个可能的经验法则。
问题是这个索引对你没有帮助。您需要首先放置等式谓词列,然后放置不等式/连接/排序列。
最好的索引是:
(LocationId, CalendarDay, DateCalculated DESC) INCLUDE (Temperature)
或者:
(CalendarDay, LocationId, DateCalculated DESC) INCLUDE (Temperature)
因此,前两列可以按任意顺序排列(升序或降序),尽管您可能想查看其他查询需要什么,因为它们可能使用其中一列作为不等式或连接谓词,或者作为排序专栏。另请注意添加了
INCLUDE
,这样您就不需要对
Temperature
列进行键查找。考虑将此索引设为聚集索引,然后自动包含所有其他列。您甚至可以将这三列设为主键并删除不必要的
Id
列。