2016-08-03 89 views
1

我有45個active併發插入事務,每個事務試圖插入(只插入沒有任何選擇或更新)大約250行到某些表。防止SQL Server併發插入鎖定

問題是,當事務想要將數據插入表中時,多索引行和索引頁上大約有1000個X和IX鎖(sys.dm_tran_locks)。

我已經將索引移動到SSD,但它沒有任何意義,我還有很多未決事務,每個事務大約需要200ms到4000ms,根據SQL事件探查器上的Adult logout完成。

緩衝區I/O,緩衝區鎖存,鎖定,鎖存,記錄等待時間在活動監視器中爲0或非常低。

我試圖增加交易次數,但我沒有任何意義,Activity monitor中的執行次數也是一樣的。

我的系統信息:

  • 2X E5,
  • 日誌文件
  • SSD RAID 0,數據
  • HDD RAID 10,
  • SSD的Raid 0的指標,
  • + 64GB DDR3,
  • SQL Server 2014 SP2

回答

0

可以有多種建議,具體取決於問題的具體原因:

  1. 您的索引。每次執行插入SQL Server都會更新表上的所有索引。所以,解決方案應該是減少表中索引的數量。

  2. IDENTITY列爭用。嘗試用UNIQUEIDENTIFIER替換IDENTITY列。

  3. 與頁面拆分相關的額外I/O。定期用較低的FILLFACTOR重建聚集索引(極端情況:< 50%)。

  4. PFS爭用。在您的數據庫中創建多個文件,並將索引/表格拆分爲它們。

  5. 您正在使用SQL2014。嘗試使用內存中功能。

+0

1.我已經禁用/刪除了很多索引。 2.我已將所有Primaries更改爲非身份,bigint並在業務級別進行初始化。 3.填充因子超過90. 4.我會這樣做,但是如果我爲每個表使用單獨的分區,它會做出任何更改?因爲I/O將是相同的。 5.內存是不可能的我認爲,根據2014年的限制和分貝(4TB)的大小 – Milad

+0

對於#3你必須看看插入過程中的分裂和分頁數量。如果是這種情況,可以將Fillfactor降低到50%甚至更低。數據不應該按聚簇索引順序排列,那麼您可以一次插入多個頁面。對於#4,您可以將一個表分成多個文件。 –

+0

非常感謝您的提示,我已將某些索引的填充因子降低到20%,並將頁面填充到70%,並將碎片最小化。此外,我還爲大表(一個文件組)添加了兩個文件,並將它們移動到另一個HDD。在這種情況下,插入和選擇將具有更好的性能,因爲兩個HDD執行操作(一個用於小型表,另一個用於大型RAID10)。此外,我創建了順序range-id而不是順序的,可以創建具有最小鎖定的多索引頁面。最後,我用「插入批量」進行批量插入,將性能提高到400%。 – Milad