2012-01-31 59 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以解析重複項。

主鍵自動唯一,幾乎所有的表都應該有主鍵。

如果(時間戳,傳感器)不唯一,或者您想從其他表中引用此數據,請考慮將標識列用作羣集主鍵。

祝你好運!