用于测量的最佳性能表设计

时间:2012-08-03 08:09:29

标签: sql-server-2008 tsql database-design

我需要创建一个表来保存包含设备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 =唯一索引)

还是完全不同的东西?

谢谢!

2 个答案:

答案 0 :(得分:1)

如果您拥有数百万行,则可以通过定义自特定日期以来的季度小时数来略微提高SELECT性能。

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

但是,当你可以测试和测量时,依赖意见是没有意义的。构建三个表,加载数百万行样本数据,并研究查询计划。 (在每个表中加载5000万行不是完全不切实际。在SO上回答问题时,我有时会在测试表中加载2000万行。)不要认为你第一次尝试索引将是最佳的。考虑多个索引,并考虑多列索引。

答案 1 :(得分:0)

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