2012-01-31 61 views
0

首先,我对数据库策略并不擅长,所以我甚至不知道如何解决这个问题。使用TSQL存储数百万行的最佳实践(Sql Server 2008)

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

  • SensorNumber(INT)

  • 阅读(INT)

  • 时间戳(日期时间?)(我只是想要追踪到分钟,没有什么需要)

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

我真的只关心按时间戳和/或SensorNumber搜索。这里的数据几乎不会被编辑(插入一次,多次阅读)。

我应该如何去建设呢?除了创建桌子之外,还有什么特别的事情可以做吗?并为SensorNumber和Temp创建一个索引?

+0

你需要解释你的查询模式是什么,因为你似乎在这个问题上自相矛盾。 – JNK 2012-01-31 19:16:58

+0

您的权利JNK,我的意思是我只是要通过传感器和/或时间戳搜索 – XenoPuTtSs 2012-01-31 19:20:35

+0

它会一直是'SENSOR',有时也是'timestamp'(字段的错误名称,BTW),或者它有时会是时间戳单独? – JNK 2012-01-31 19:21:25

回答

4

基于您的评论,我会放一个聚集索引上(Sensor, Timestamp)

当您想要单独搜索传感器时,这将始终覆盖,但也将涵盖组合检查的两个字段。

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

本设计的一个问题是需要重建表格,因为您要非顺序地插入行 - 新行并不总是属于索引的末尾。

此外,请不要命名字段timestamp - 这是SQL Server中的关键字,如果不在任何地方对它进行分隔,都会导致各种问题。

+0

我想出了一个更好的名字为我的日期时间字段。谢谢你的帮助! – XenoPuTtSs 2012-01-31 19:31:05

2

您一定要使用SQL-Server“clustered index”作为最有选择性的您可能要搜索的数据。

下面是详细信息:

阐述:

  • “传感器”将是一个糟糕的选择 - 您可能会有很少的传感器,许多行。这将而不是是一个歧视指数。

  • “时间”将是歧视......但它也是一个不好的选择。因为时间本身与传感器,温度等无关,可能对您的查询毫无意义。

  • “传感器,时间”上的聚集索引可能是理想的。或者也许不是 - 这取决于你在做什么。

  • 请检查上面的链接。

PS:

请,也可以考虑使用 “日期时间”,而不是 “时间戳”。他们是MSSQL下两个完全不同的类型......和“日期时间”无疑是更好的,更灵活的选择:

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

+1

我不确定你为什么把“聚簇索引”放在“quotaton”“marks”中...... – JNK 2012-01-31 19:18:15

+0

因为“聚簇索引”是一个Microsoft SQL Server特定的术语;) – paulsm4 2012-01-31 19:30:50

+0

@JNK我得到了一个那个评论。 – 2012-01-31 19:59:37

0

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

聚集索引决定数据存储的顺序,添加到最后比插入到中间要便宜。

想象一下你在添加卡片时想要保持排名顺序的一副纸牌。如果最高排名是8,那么加9就是微不足道的 - 把它放在最上面。 如果你添加一个5,它会变得更加复杂,你必须找出把它放在哪里然后插入它。

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

鉴于我建议在(时间戳,传感器)中有一个聚集索引。

(传感器,时间戳)上的聚类会对数据的物理排序产生很大的变化,这些数据非常昂贵(即使使用SSD)。

如果Timestamp,Sen​​sor组合是唯一的,那么将其定义为UNIQUE,否则Sql Server将在索引中添加一个uniqueidentifier以解析重复项。

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

如果(时间戳,传感器)不唯一,或者您想从其他表中引用此数据,请考虑将标识列用作群集主键。

祝你好运!