3

我在SQL Server 2012中有一個大表,它包含大約3400萬條記錄。我有一個批處理程序,每5分鐘插入一次/更新表格,並且我有一個隨時從表格中讀取的Web應用程序。SQL Server 2012插入塊讀取

每次批處理程序寫入表時,都會導致讀取過程非常緩慢。我認爲它與隔離級別有關,但我不是那麼喜歡SQL Server,所以我不知道如何修復它。

對我來說最好的方案是讓插入不阻止讀取。有沒有可能在查詢中指定?或者我必須更改讀取查詢來選擇「髒行」?

該應用程序不是嚴格依賴於「新鮮」的數據,所以如果我可以強制數據庫允許髒讀,它會沒事的。但我不知道我能做到這一點,或者如果這是一個更好的解決方案。

+1

插入將總是對新插入的行進行獨佔鎖 - 並且SQL Server在5,000個鎖附近有一個限制;如果超過該限制,那麼鎖可能會*升級*到表級別。所以問題是:你是否一次插入少於5000行的批次(事務)數據?如果不是,請嘗試將INSERT分解爲更小的事務。 –

+0

沒有很好的理由解釋爲什麼會發生這種情況,所以這個問題比迄今爲止告訴我們的還要多。爲了給我們提供任何有用的幫助,您應該發佈表定義,包括任何鍵和索引定義。您還應該向我們展示批處理程序正在執行哪種SQL插入/更新,以及Web應用程序正在使用哪種SQL讀取語句。最後,給我們一些關於批處理程序的簡介:一次插入和更新多少行,需要多長時間才能運行? – RBarryYoung

回答

1

你當然不能停止插入/更新放置鎖,事情會非常迅速地出錯。您可以在讀取操作上設置隔離級別來表示讀取未提交,或將其指定爲select中的提示。但他們暗示,如果存在丟失數據完整性的風險,而不是簡單地返回髒數據(並且存在許多缺陷),那麼dbms將完全忽略它們。 還有其他的事情你可以做,但如果你認真對待,得到一個SQL服務器DBA,這種事情已經超過天賦業餘水平,沒關係新手。

+0

「read uncommitted」與NOLOCK完全相同,如同查詢隨機中止一樣。鎖定提示不是提示,而是確切的。 – usr

+0

「閱讀未提交」正是你不想做的。讀取已提交應該跳過未提交的行,除非鎖已經升級(這裏可能存在問題),這需要自行解決。 – RBarryYoung

+0

我說他應該這樣做嗎?不,我說這就是你要做的事,如果你想讓你儘可能地躲避儘可能多的鎖。很明顯,你躲閃越多,你獲得的數據可能會越多。閱讀提交更有可能升級,並且有些提示會被忽略,但並不總是準確的。這加上上面的其他警告是爲什麼我說讓一個DBA進來。我很清楚,我不太瞭解這個主題,也不太瞭解OP需要發表關於他應該做什麼的聲明,也許你應該把它們放在你自己身上... –

1

有一個簡單的答案和硬答案:

這是很容易解決,如果你可以打開和使用快照隔離。這爲讀者解決了阻塞和一致性問題。

如果你不能這樣做,這個問題可能很難解決,但沒有足夠的信息來回答。

因此,儘量爲讀者使用快照隔離,並確保在使用它之前閱讀它。