C-Sharp
如何保證對 SQL Server 2008 R2 的插入首先記憶體在 RAM 中?
想像一個“突發”的數據流,即它可能有 10,000 個事件很快到達,然後一分鐘內甚麼也沒有。
您的專家建議:如何為 SQL Server 編寫 C# 插入程式碼,以保證 SQL 將所有內容立即記憶體在其自己的 RAM 中,而不會阻塞我的應用程序超過將數據輸入所述 RAM 所需的時間?為了實現這一點,您是否知道設置 SQL 伺服器本身的任何模式,或者設置我正在寫入的各個 SQL 表的模式?
當然,我可以做我自己的版本,包括在 RAM 中建構我自己的隊列——但我不想重新發明舊石器時代的石斧,可以這麼說。
你有沒有試過寫信看看會發生什麼?你有一個已知的瓶頸嗎?
如果您需要防止您的應用程序被阻止,那麼一種方法是將寫入排隊以推遲數據庫呼叫。但是,我希望隊列在一兩秒內清除:所以如果可以的話,你需要一個隊列嗎?
或者您可以將其放到臨時台上,然後再沖洗?我們使用這種技術來處理每分鐘數百萬新行的持續寫入(我們實際上使用帶有簡單恢復的暫存數據庫):但直到我們有僅寫入行的經驗才實現它。
注意:SQL Server 中的每次寫入都將作為預寫日誌 (WAL) 協議的一部分執行磁碟。這適用於該寫入的 t-log 條目。
帶有該行的數據頁將在某個時間點(基於時間、使用、記憶體壓力等)進入磁碟,但通常您的數據無論如何都會在記憶體中。這稱為“檢查點”,不會從記憶體中驅逐數據,只是刷新更改(2011 年 11 月 24 日編輯)
編輯:
出於全面考慮,根據上面的最後一段,將此數據庫的 LDF 轉移到一組專用磁碟以獲得更高的性能。同上一個暫存數據庫(MDF/LDF 各一個)。為您的數據庫伺服器擁有十幾個或三個不同的捲(通常通過 SAN)是很常見的