我需要创建一个表来保存包含设备id(int),logdate(datetime)和值(decimal)的测量值(SQL Server 2008)。测量总是在四分之一,例如00:00,00:15,00:30,0:45,01:00,01:15 ......所以我认为定义自某个日期以来的季度数量的int将导致比a日期时间。
检索通常使用以下方法完成:
-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 =唯一索引)
还是完全不同的东西?
谢谢!
答案 0 :(得分:1)
如果您拥有数百万行,则可以通过定义自特定日期以来的季度小时数来略微提高SELECT性能。
就个人而言,我认为边际绩效收益不值得降低可读性。我也不喜欢将设计基于四分之一小时的假设。 (根据我的经验,这种要求通常会随着时间而变化。)现在,可以在日期时间列中包含一个四分之一小时的CHECK约束,如果该要求发生变化,则稍后将其删除。
但是,当你可以测试和测量时,依赖意见是没有意义的。构建三个表,加载数百万行样本数据,并研究查询计划。 (在每个表中加载5000万行不是完全不切实际。在SO上回答问题时,我有时会在测试表中加载2000万行。)不要认为你第一次尝试索引将是最佳的。考虑多个索引,并考虑多列索引。
答案 1 :(得分:0)
我认为没有针对您的标准的任何具体指导方针。您可能需要创建和测试(您可以在每个中插入演示数据)。由于您希望提高性能,我建议您在表格中使用索引。