Sql-Server

插入流式 RFID 數據

  • February 25, 2019

我有 RFID 閱讀器目前將數據寫入硬碟驅動器上的文件,然後 SSIS 讀取並插入數據庫。相反,我更喜歡 SQL Server (2016+) 將數據流直接讀取到記憶體優化表中,以提高性能和處理可伸縮性。

執行此操作的最佳方法是什麼,同時處理多個讀取器發送數據,並確保沒有數據因瓶頸、死鎖等而失去?

每個閱讀器每秒可以處理大約 60 次讀取,然後通過 wi-fi(或稍後通過 USB 底座)傳輸。所以每分鐘,我們說的是每個閱讀器 60x60x512 位的數據。對於未來,假設在大型倉庫中可能同時有 10 多個讀者。

同時處理和讀取數據。當讀取器數據進入時,需要檢查不一致、冗餘、重複數據刪除、更新(例如,如果產品位置已移動)等。然後,將對數據庫進行查詢/報告 - 各種使用者搜尋,庫存和位置報告,分析。

還要處理由於讀取器同時傳遞數據而導致的瓶頸 - 即,假設 5 個讀取器通過底座同時傳遞他們的日常數據,而數據庫正在執行各種其他任務。

您對未來最大並發連接數保持在 10 個有多大信心?

如果您對原始速度感興趣——這是記憶體中 OLTP 領域的一部分——那麼通過 wifi 傳輸可能會成為瓶頸。即使您主要對寫入工作負載的可擴展性感興趣 - wifi 或 USB 底座也會有其限制 - 阻止使用記憶體中 OLTP 的全部(潛在)好處。

雖然 Tony Hinkle 正確地認為 IDENTITY 比 GUID 更“高效”,但在 IDENTITY 上進行集群對於高並發、寫入密集型工作負載來說是一種反模式。In-Memory 旨在解決的正是這種反模式,但考慮使用 In-Memory OLTP 應該啟動一個考慮到所有許多陷阱的對話框,即沒有數據庫鏡像,沒有快照,永遠不會刪除記憶體-優化的文件組等

使用任何形式的快照隔離時,查詢可能會產生不同的結果,因此您必須驗證您的應用程序的工作方式是否可以處理這種情況。

因此,雖然要插入的數據量不是特別多,但如果您向其拋出足夠多的並發連接,可伸縮性將是一個問題。這很容易用 ostress 展示(只要您不輸出到文件)。隨著並發性的增加,例如從 100 個連接到 500 個連接,INSERT 性能只會爬行。這是因為必須鎖定聚集索引的最後一頁,這實際上是對錶的所有寫入序列化。

鑑於您所描述的,記憶體中 OLTP 可能最好用作“減震器”,作為數據的著陸墊。然後您可以在將其發送到最終目的地之前對其進行驗證。如果最終目的地是另一個記憶體優化表,請注意所有對記憶體優化表的寫入都是串列的,無論源是什麼。因此,您將不得不推出自己的並行性,並確保您的處理不會踩到自己的腳趾。您實際上將擁有一個隊列,並且由於其無鎖架構,記憶體中 OLTP 不太適合隊列處理。必須有某種形式的序列化以確保您的並發程序不會嘗試處理同一組行。

所有傳統/基於磁碟的表都可能遭受死鎖,通常可以減少甚至消除死鎖,但不能保證這一點。由於無鎖/閂鎖架構(對於記憶體優化表上的索引也是如此),記憶體優化表不可能出現死鎖。

使用 In-Memory OLTP 查詢可能不會更快,因為它不是為此而設計的。

我已經在部落格中廣泛介紹了記憶體中 OLTP。如果您正在認真考慮部署它,我強烈建議您學習我所寫的內容。

您在評論中提供的公式(6060512 位)表明每個閱讀器每分鐘將插入 230 KB 的數據。這是相當微不足道的數據量。如果您有錯誤的配置或史詩規模的可怕程式碼,那麼您會遇到問題的唯一方法。無需費心使用記憶體優化表。沒有理由擔心鎖定和阻塞或其他任何事情。你可以把 SQL Server 放在你能買到的最便宜的筆記型電腦上,它有 2 個核心和 4 GB 記憶體,它就能很好地跟上。

因此,按照您引用的費率,對於 10 位讀者來說,數據略高於 3 GB:

6060512 =

1,843,200 位 1843200 / 8 = 230,400 字節

230400 * 60(分鐘)* 24(小時)= 每天 331,776,000 字節 (331 MB)

331 * 10(閱讀器數量)= 3.31 GB

因此,要麼我們遺漏了問題的重要部分,要麼您完全沒有什麼可擔心的。

至於你對阻塞等的擔憂,沒有簡單的答案。如果數據庫和查詢設計得當,那麼你就可以開始了。如果您不知道從哪裡開始正確的數據庫設計,那麼您可能會考慮聘請顧問來做這件事。如果您使用已送出的快照,讀者將不會阻止作者,反之亦然。我不會擔心 INSERT 會被您引用的大量數據阻塞——它們應該非常快,以至於任何阻塞都將是微不足道的,當然,假設設計的數據庫沒有嚴重的缺陷。對於 INSERT 效率,主要關注的是確保您的主鍵是序列號,而不是 GUID 或某種字元串。

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