簡體   English   中英

C#+ SQL Server-最快/最有效的方式將新行讀入內存

[英]C# + SQL Server - Fastest / Most Efficient way to read new rows into memory

我有一個SQL Server 2008數據庫,並且正在將C#4.0與Linq to Entities類一起使用以進行數據庫交互。

存在一個在DateTime列上建立索引的表,其中值是該行的插入時間。 一秒鍾(〜20)添加了幾行新記錄,我需要有效地將它們拉入內存,以便可以在GUI中顯示它們。 為簡單起見,我只需要說說我需要在通過WPF顯示的列表中顯示最新的50行。

我擔心負載輪詢可能會放在數據庫上,處理新結果將花費時間,這迫使我成為緩慢的使用者(陷入積壓)。 我希望就此方法提出一些建議。 我正在考慮的是

  1. 緊密輪詢數據庫(每個查詢約1個結果)
  2. 每秒輪詢數據庫(每個查詢約20個結果)
  3. 為插入創建數據庫觸發器,並將其綁定到C#中的事件( SqlDependency

我也有一些訪問選項。

  1. Linq到實體表選擇
  2. 原始SQL查詢
  3. Linq到實體存儲過程

如果您可以了解利弊,或者完全建議另一種方式,我很想聽聽。

將行添加到表的過程不在我的控制下,我只希望讀取行,而無需修改或添加。 最重要的事情是不要使SQL Server超載,保持GUI為最新並具有響應能力,並使用盡可能少的內存...您知道,基本知識;)

謝謝!

與其輪詢數據庫,不如可以使用SQL Server Service代理並從那里進行讀取,甚至可以推送新的行。 然后,您可以從表格中選擇。

我在這里看到的最重要的事情是在標識新行的方式上有一個索引(時間戳?)。 這樣,您的查詢將從索引中選擇頂部條目,而不是每次都查詢表。

測試,測試,測試! 根據您想嘗試的任何策略來評估您的表現。 要解決的最大問題是數據的存儲方式以及需要處理的所有鎖定和一致性問題。

如果您的表以每秒20行的速度不斷更新,則沒有更好的方法可以每秒或每隔幾秒鍾進行一次拉動。 只要您有一種有效的方法(意味着索引或聚集索引)可以檢索最后插入的行,則此方法將消耗最少的資源。

如果更新以每秒20次的突發速度進行更新,但之間有相當長的不活動時間(分鍾),那么您可以使用SqlDependency(順便說一下,它與觸發器完全無關,請閱讀The Mysterious Notification for udneratand how它確實有效)。 您可以將LINQ與SqlDependency混合使用,請參見linq2cache

是否需要查詢以通知新數據?

使用來自服務總線(例如: NServiceBus )的推送通知可能會更好。

使用通知(即事件)幾乎總是比使用輪詢更好的解決方案。

我在這里參加聚會有點晚了,但是如果您的SQL Server 2008版本具有該功能,則有一項稱為Change Data Capture的功能可能會有所幫助。 基本上,您必須為數據庫和需要捕獲的特定表都啟用此功能。 內置的“更改數據捕獲”過程查看事務日志以確定對表進行了哪些更改,並將它們記錄在預定義的表結構中。 然后,您可以查詢該表或將表中的結果拉入更友好的內容(也許完全在另一台服務器上?)。 我們正處於針對特定業務需求使用此功能的早期階段,到目前為止,它似乎運行良好。

您將必須測試該功能是否可以滿足您的需求,但是它可以幫助維護,因為不需要觸發器,並且數據捕獲不會占用您的數據庫表本身。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM