2012-08-03 72 views
0

我需要创建一个表,保存包含设备id(int),logdate(datetime)和值(十进制)(SQL Server 2008)的测量值。测量总是在本季度。 00:00,00:15,00:30,00:45,01:00,01:15 ...所以我在想,定义自某个日期以来宿舍数量的整数将导致更好的性能约会时间。测量的最佳性能表设计

检索通常会使用来完成以下事项:

-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

您期望录制多少个季度?您希望注册多少设备? – Andrew 2012-08-03 08:15:25

+0

大约100.000个设备,我会为每个设备保留大约96 * 5个宿舍。 – Bruno 2012-08-03 08:17:28

+0

我总是倾向于选择2.在这种情况下,我不知道哪个更好。选项2意味着你会意味着更大的表和索引,但我认为插入会更快。我认为对于选项1,由于PK上的聚集索引,您可能会遇到问题。 – Andrew 2012-08-03 08:25:56

回答

1

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

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

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

0

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