【问题标题】:Best performance table design for measurments用于测量的最佳性能表设计
【发布时间】:2012-08-03 08:09:28
【问题描述】:

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

还是完全不同的东西?

谢谢!

【问题讨论】:

  • 您希望记录多少个季度?您希望注册多少台设备?
  • 大约 100.000 台设备,我将为每个设备保留大约 96*5 个季度
  • 我总是倾向于选择您的选项 2。在这种情况下,我不知道哪个会更好。选项 2 意味着您将意味着更大的表和索引,但我认为插入会更快。我认为对于选项 1,由于 PK 上的聚集索引,您可能会遇到问题。
  • 我发现这篇博文与我的情况相似。他的结论正确吗?他对填充因子的评论是否也正确? improve.dk/archive/2011/05/24/…

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


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2012-07-23
      • 1970-01-01
      • 1970-01-01
      • 2014-09-26
      • 2017-11-30
      • 1970-01-01
      • 1970-01-01
      • 2012-05-20
      • 1970-01-01
      相关资源
      最近更新 更多