2013-05-07 70 views
-1

我有一個正在運行的系統,其中數據被定期插入到MS SQL DB中,並且Web應用程序用於向用戶顯示此數據。將數據插入MS SQL數據庫而不鎖定它的最快方法是什麼?

在插入數據的用戶應該能夠繼續使用DB,可惜的是我不能重新設計整個系統現在。每插入2小時40k-80k記錄。

眼下的過程是這樣的:創建

  1. 臨時表
  2. 數據使用普通的INSERT語句(參數化查詢或存儲proceuders應該提高速度)插入到它。
  3. 數據從臨時表抽到使用INSERT INTO MyTable(...) SELECT ... FROM #TempTable

我認爲這樣的做法是非常低效的目標表。我看到,插入階段可以改進(批量插入?),但是如何將數據從臨時表傳輸到目標?

回答

2

這是我們做了幾次。將表格重命名爲TableName_A。創建一個調用該表的視圖。與第一個表(Tablename_B)完全相同地創建第二個表。用第一個數據填充它。現在設置您的導入過程以填充未被視圖調用的表格。然後改變視圖來調用該表。幾秒鐘的用戶總停機時間。然後重新填充第一個表格。如果您可以截斷並填充表,那麼實際上會更容易,因爲您不需要最後一步,但如果您的輸入數據不是完整刷新,則這可能是不可能的。

+0

看來我已經在該表中有很多數據了。似乎複製它也需要一些時間。 – artvolk 2013-05-08 08:31:15

1

插入表格時無法避免鎖定。即使使用BULK INSERT,這也是不可能的。

但是,希望在併發INSERT操作來訪問此表可以這樣做改變的事務隔離級別讀取未提交或通過與使用NOLOCK選項執行SELECT命令時客戶端。

INSERT命令仍然會鎖定表/行,但隨後的SELECT命令將忽略這些鎖也未提交讀條目。

相關問題