首先,我对数据库策略不是很了解,所以我真的不知道如何处理这个问题。
我想要做的是将一些信息存储在数据库中。基本上数据看起来像这样
SensorNumber (int)
阅读(int)
时间戳(日期时间?)(我只想追踪到分钟,不需要进一步了)
唯一的问题是,经过几个月的跟踪,我将拥有数百万行(约500万行)。
我真的只关心通过Timestamp和/或SensorNumber进行搜索。这里的数据几乎不会被编辑(插入一次,多次读取)。
我该怎么做呢?除了创建表格之外,我还有什么特别之处吗?并为SensorNumber和Temp创建一个索引?
答案 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,Sensor)中使用聚簇索引。
群集(传感器,时间戳)将对数据的物理排序产生很多变化,这非常昂贵(即使使用SSD)。
如果Timestamp,Sensor组合是唯一的,则将其定义为UNIQUE,否则Sql Server将在索引上添加唯一标识符以解决重复项。
主键自动唯一,几乎所有表都应有主键。
如果(时间戳,传感器)不是唯一的,或者您想从另一个表引用此数据,请考虑使用标识列作为群集主键。
祝你好运!