Sql-Server-2016

在 SQL Server 數據庫中儲存 PLC 數據

  • August 2, 2019

我正在開發一種軟體解決方案,該解決方案需要將源自許多 PLC(可程式邏輯控制器,用於控制傳送帶和機器人等工業機器)的原始數據點儲存到 SQL Server 數據庫中。我主要關心的是如何正確儲存大量原始數字數據。

每個數據點具有以下屬性:

  1. 日期時間戳
  2. 可能是:布爾值、整數、浮點數或字元串
  3. 全年每秒可儲存一個數據點(每年約 31,536,000 個數據點)

我從中收集數據的每個 PLC 可能有多達 500 個數據點,我想計劃支持數千個 PLC。意思是,我每年至少有 15,768,000,000,000 個數據點(每年 31,536,000 個點 * 500 個點 * 1000 個 plc)。我目前對每種數據類型(bool、int、float、string)都有一個表。為了減少記錄和儲存的數量,我每條記錄儲存 4 個數據點

$$ ID, DateTime, DataGroupID, Value1, Value2, Value3, Value4 $$. 我已經實現了這個,它執行良好(使用我最大的表進行快速查詢,大約 7200 萬條記錄)雖然它不是很靈活(更改數據類型需要在表之間移動數據,重新組合數據需要更改表/列,等等。)

因此,我提高靈活性的想法是保留數據類型特定的表,而只是將每個數據點儲存為自己的記錄。bigint 的最大大小(記錄 ID 的數據類型)的一些簡要數學表明我有很多可用的 ID。儘管儲存要求和查詢性能仍然是一個問題。我應該擔心使用這種方法的任何事情嗎?有更好的選擇嗎?

我擔心的根源是我根本沒有體驗過巨大的數據庫/表,所以雖然我知道幾百萬條記錄很小,但我仍然不知道一個 over-the-top 表會是什麼樣子。此外,數據的儲存是我的軟體的基礎,因此更新需要大量工作才能實現。

讓我們從基礎開始:

**您是否應該每年在關係數據庫中儲存 16 萬億個原始數據點?**可能不是。想一想之後你將如何處理它,以及這些查詢會是什麼樣子。關係數據庫非常適合與其他表有關係並且需要經常插入/更新/刪除,或由常用報告工具讀取的數據,但在這裡不太適合。

如果您不在 RDBMS 中執行此操作,您在哪裡執行此操作? 滿足時間序列數據庫,專門為此目的而設計的東西。範例包括GraphiteInfluxDB

**如果必須這樣做,你應該注意什麼?**任何類型的維護都將極具挑戰性——索引重建、統計更新、備份、CHECKDB 等。相反,請考慮動態分片設計,將數據拆分為更小的捲。例如,在數據倉庫領域,大型表通常按日期範圍(2017Q3、2017Q2、2017Q1 等)拆分,因此如果需要為新傳入的數據添加新列,只需修改目前表即可。出於報告目的,您可以將所有表合併到一個視圖中 - 但請注意,對萬億行表的任何類型的即席查詢都可能具有挑戰性。(如果有人想要排序並且沒有支持索引,那麼天堂會幫助您 - 再見,tempdb 驅動器空間。)

引用自:https://dba.stackexchange.com/questions/182635