使用TSQL存储数百万行的最佳实践(Sql Server 2008)

时间:2012-01-31 19:09:16

标签: sql-server database tsql

首先,我对数据库策略不是很了解,所以我真的不知道如何处理这个问题。

我想要做的是将一些信息存储在数据库中。基本上数据看起来像这样

  
      
  • SensorNumber (int)

  •   
  • 阅读(int)

  •   
  • 时间戳(日期时间?)(我只想追踪到分钟,不需要进一步了)

  •   

唯一的问题是,经过几个月的跟踪,我将拥有数百万行(约500万行)。

我真的只关心通过Timestamp和/或SensorNumber进行搜索。这里的数据几乎不会被编辑(插入一次,多次读取)。

我该怎么做呢?除了创建表格之外,我还有什么特别之处吗?并为SensorNumber和Temp创建一个索引?

3 个答案:

答案 0 :(得分:4)

根据您的评论,我会在(Sensor, Timestamp)上添加聚集索引。

如果您想单独搜索SENSOR,这将始终涵盖,但也会覆盖两个组合检查的字段。

如果您想单独搜索Timestamp,您也可以在那里添加非聚集索引。

这个设计的一个问题是需要重建表,因为你要按顺序插入行 - 新行不会总是属于索引的末尾。

此外,请不要将字段命名为timestamp - 这是SQL Server中的关键字,如果您不在任何地方划分它,可能会导致各种问题。

答案 1 :(得分:2)

您肯定希望将SQL服务器“clustered index”用于您可能会搜索的最具选择性的数据。

以下是更多信息:

阐述:

  • “传感器”将是一个糟糕的选择 - 您可能只有很少的传感器,很多行。这是一个有辨别力的指数。

  • “时间”会有所区别......但这也是一个糟糕的选择。因为时间本身(与传感器,温度等无关)对您的查询可能毫无意义。

  • “传感器,时间”上的聚集索引可能是理想的。或许不是 - 这取决于你所追求的目标。

  • 请查看以上链接。

PS:

请同样考虑使用“datetime”而不是“timestamp”。它们是MSSQL下的两种完全不同的类型......而“datetime”可以说是更好,更灵活的选择:

http://www.sqlteam.com/article/timestamps-vs-datetime-data-types

答案 2 :(得分:0)

我同意使用聚集索引,你几乎肯定会最终得到一个 - 所以最好定义它。

聚集索引确定数据的存储顺序,添加到结尾比插入数据更便宜。

想象一下,当你添加卡片时,你试图保持等级顺序的一副牌。如果最高等级为8,则添加9是微不足道的 - 将其置于顶部。 如果你添加一个5,它会变得更复杂,你必须找出放置它的位置然后插入它。

因此,按顺序添加具有聚簇索引的项目是最佳的。

鉴于我建议在(Timestamp,Sen​​sor)中使用聚簇索引。

群集(传感器,时间戳)将对数据的物理排序产生很多变化,这非常昂贵(即使使用SSD)。

如果Timestamp,Sen​​sor组合是唯一的,则将其定义为UNIQUE,否则Sql Server将在索引上添加唯一标识符以解决重复项。

主键自动唯一,几乎所有表都应有主键。

如果(时间戳,传感器)不是唯一的,或者您想从另一个表引用此数据,请考虑使用标识列作为群集主键。

祝你好运!