![](/img/trans.png)
[英]What is the most efficient way to read many bytes from SQL Server using SqlDataReader (C#)
[英]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行。
我擔心負載輪詢可能會放在數據庫上,處理新結果將花費時間,這迫使我成為緩慢的使用者(陷入積壓)。 我希望就此方法提出一些建議。 我正在考慮的是
我也有一些訪問選項。
如果您可以了解利弊,或者完全建議另一種方式,我很想聽聽。
將行添加到表的過程不在我的控制下,我只希望讀取行,而無需修改或添加。 最重要的事情是不要使SQL Server超載,保持GUI為最新並具有響應能力,並使用盡可能少的內存...您知道,基本知識;)
謝謝!
與其輪詢數據庫,不如可以使用SQL Server Service代理並從那里進行讀取,甚至可以推送新的行。 然后,您可以從表格中選擇。
我在這里看到的最重要的事情是在標識新行的方式上有一個索引(時間戳?)。 這樣,您的查詢將從索引中選擇頂部條目,而不是每次都查詢表。
測試,測試,測試! 根據您想嘗試的任何策略來評估您的表現。 要解決的最大問題是數據的存儲方式以及需要處理的所有鎖定和一致性問題。
如果您的表以每秒20行的速度不斷更新,則沒有更好的方法可以每秒或每隔幾秒鍾進行一次拉動。 只要您有一種有效的方法(意味着索引或聚集索引)可以檢索最后插入的行,則此方法將消耗最少的資源。
如果更新以每秒20次的突發速度進行更新,但之間有相當長的不活動時間(分鍾),那么您可以使用SqlDependency(順便說一下,它與觸發器完全無關,請閱讀The Mysterious Notification for udneratand how它確實有效)。 您可以將LINQ與SqlDependency混合使用,請參見linq2cache 。
我在這里參加聚會有點晚了,但是如果您的SQL Server 2008版本具有該功能,則有一項稱為Change Data Capture的功能可能會有所幫助。 基本上,您必須為數據庫和需要捕獲的特定表都啟用此功能。 內置的“更改數據捕獲”過程查看事務日志以確定對表進行了哪些更改,並將它們記錄在預定義的表結構中。 然后,您可以查詢該表或將表中的結果拉入更友好的內容(也許完全在另一台服務器上?)。 我們正處於針對特定業務需求使用此功能的早期階段,到目前為止,它似乎運行良好。
您將必須測試該功能是否可以滿足您的需求,但是它可以幫助維護,因為不需要觸發器,並且數據捕獲不會占用您的數據庫表本身。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.