2009-09-12 76 views
3

我有一個後臺進程,不斷插入表中實時。它可能是一小時數千個插入(有幾個更新)。 Web應用程序使用該表來獲取需要顯示給用戶的一些數據。表插入期間鎖定...網站不可用(SQL Server 2008)

當前每當後臺進程運行其插入/更新時,Web應用程序似乎都被阻止,並且無法訪問數據庫。

我想知道一個好的解決方案可能是什麼。我應該創建另一個表插入並將表複製到另一個只讀表中?有另一種方法嗎?

任何幫助和建議,非常感謝!

回答

4

特別是對於SQL Server,您可能需要更改數據庫以打開READ_COMMITTED_SHAPSHOT

這基本上可以防止您的選擇查詢在數據上存在未決的插入/更新時被鎖定。

3

有些東西看會:

1)你的插入/更新或SELECT查詢交易的一部分?如果是這樣,確保你已經爲你的特定情況設置了最有利的transaction isolation level

2)你在這張巨大的桌子上有太多索引嗎?索引加速選擇,但放慢插入和更新。確保你只有絕對需要的索引。

3)與#2相關。你是否缺少能加速你選擇的索引?您的選擇語句是否執行全表掃描?查看查詢執行計劃以查看實際發生的情況。 (查詢分析器可以幫助你)。

4)考慮將您的巨型數據複製到一個或多個只讀數據庫服務器,這些服務器可以處理選擇流量,而讀/寫主表(即您現有的表)主要處理插入/更新流量。

5)您是否觸發了可能導致性能問題或鎖定問題的插入/更新操作?

6)您的應用程序是否遇到死鎖事務?看看這個主題MSDN article,看看它是否有幫助。另外,請確保您瞭解dining philosophers problem,這樣可以避免死鎖事務。

1

如果您使用的是企業版,理想的解決方案是使用滑動窗口分區。本質上,您可以在同一個文件組上創建一個相同的表,將數據加載到所述表中,然後將表的分區「切換」到生產表中。實際的操作只是一個元數據翻轉,所以它或多或少瞬間發生。查看更多信息: http://technet.microsoft.com/en-us/library/ms191160.aspx

0

如果您只是需要從Web應用程序的表中讀取數據,則可能需要嘗試對查詢使用READ_UNCOMMITTED隔離級別。它不佔用任何鎖並讀取未提交的數據。我不會推薦爲銀行應用程序這樣做,但最典型的商業Web應用程序可能不會有問題。請確保在查詢後將隔離級別設置回通常使用的內容(READ COMMITTED?)。

如果使用READ_UNCOMMITTED對您不合適,您可以熟悉Row Versioning-Based isolation levels。例如,快照隔離使用樂觀的方法來修改數據,從而減少了對行進行悲觀鎖定的需求。