0

我需要创建一个表来保存由设备 id (int)、logdate (datetime) 和 value (decimal) (SQL Server 2008) 组成的测量值。测量值总是在季度,例如 00:00, 00:15, 00:30, 00:45, 01:00, 01:15 ......所以我认为一个 int 定义了自某个日期以来的季度数量将导致比日期时间更好的性能。

检索通常使用以下方法完成:

  -where DeviceId = x and QuarterNumber between a and b
  -where DeviceId in (x, y, ...) and QuarterNumber between a and b
  -where DeviceId = x and QuarterNumber = a

这张桌子的最佳设计是什么?

PK DeviceId int
PK QuarterNumber int
   Value int

或者

PK MeasurementId int
UQ QuarterNumber int
UQ DeviceId int
   Value int

(UQ=唯一索引)

还是完全不同的东西?

谢谢!

4

2 回答 2

1

如果您有数百万行,则可以通过定义自某个日期以来的四分之一小时数来获得稍微更好的 SELECT 性能。

就个人而言,我认为边际性能提升不值得降低可读性。我也不喜欢将设计基于四分之一小时的假设。(根据我的经验,这种要求通常会随着时间的推移而变化。)您现在可以在日期时间列上包含一个四分之一小时的 CHECK 约束,如果该要求发生变化,稍后将其删除。

但是,当您可以测试和衡量时,依靠意见是没有意义的。建三张表,加载几百万行样本数据,研究查询计划。(将 5000 万行加载到每个表中并非完全不切实际。我有时会在回答关于 SO 的问题时将 2000 万行加载到测试表中。)不要假设您对索引的第一次尝试是最佳的。考虑多个索引,也考虑一个多列索引。

于 2012-08-03T08:24:46.027 回答
0

我认为您的标准没有任何具体的指导方针。您可能需要创建和测试(您可以在每个中插入演示数据)。由于您希望提高性能,我建议您在表中使用索引。

于 2012-08-03T09:19:26.360 回答