我們目前正在開發一個應用程序,可爲每個用戶會話在特定表中生成5-10,000行數據。目前我們正在使用sql文本命令一次插入每行數據,因此保存操作可能需要一分鐘時間。我們正在玩弄使用SqlBulkInserts,並看到時間下降到不到500毫秒。有沒有人反對在生產應用程序中使用SqlBulkInserts,其中許多用戶將使用該系統?在生產應用程序中使用SqlBulkInsert
回答
我從來沒有遇到與SqlBulkCopy與tableLock選項設置和另一個用戶被阻止,由於它的問題。 TableLock選項可以提高插入效率,從許多人已經討論過的內容開始,只是簡單地使用它給我看。
我的典型方法:
public void Bulk(String connectionString, DataTable data, String destinationTable)
{
using (SqlConnection connection = new SqlConnection(connectionString))
{
using (SqlBulkCopy bulkCopy =
new SqlBulkCopy
(
connection,
SqlBulkCopyOptions.TableLock |
SqlBulkCopyOptions.FireTriggers |
SqlBulkCopyOptions.UseInternalTransaction,
null
))
{
bulkCopy.BatchSize = data.Rows.Count;
bulkCopy.DestinationTableName = String.Format("[{0}]", destinationTable);
connection.Open();
bulkCopy.WriteToServer(data);
}
}
}
如果您的應用程序確實需要爲每個會話創建多條記錄,我認爲這是正確的選擇。
使用前SqlBulkInsert實施,嘗試動態創建INSERT
查詢,看起來像這樣:
insert into MyTable (Column1, Column2)
select 123, 'abc'
union all
select 124, 'def'
union all
select 125, 'yyy'
union all
select 126, 'zzz'
這將只有一個數據庫調用,這應該更快地運行。對於SQL字符串連接,請確保使用StringBuilder
類。
我確實接受了這個想法,但是這個方法的問題是我需要爲服務器上的主鍵創建的身份值,因爲我們正在構建一個層次樹,因爲這是一個自引用表。 – PCG 2012-01-06 19:30:55
那又如何?這也完全排除了SqlBulkCopy的使用 - 如果您需要服務器生成的ID,您如何進行批量插入?答案是有效的,你的評價與你自己的陳述相矛盾。 – TomTom 2012-01-06 19:49:28
你的權利和我是一個白癡。我們在SqlBulkCopy實現中所做的工作是檢索我們剛剛在樹的每個級別插入的數據列表,以檢索生成的id列表。我甚至沒有想過用上面提供的陳述來做同樣的事情。 – PCG 2012-01-06 20:20:04
- 1. 在生產應用程序中使用lucene.net中繼
- 2. 任何人在生產應用程序中使用IronPython?
- 3. 在生產Java應用程序中使用JMX監視什麼?
- 4. 使用MongoDB,Mongomapper在生產中部署rails應用程序
- 5. 如何使用Droidtext Android應用程序內,從資產產生
- 6. jFormer用於生產應用程序?
- 7. 在應用程序生產階段使用StrictMode
- 8. 在使用螞蟻構建android應用程序時產生NullPointerException
- 9. 我應該在生產應用程序中避免打包嗎?
- 10. Android SQLite應用程序,準備生產
- 11. Winforms應用程序生產服務器
- 12. 「摧毀」不生產 - Rails應用程序
- 13. Joone與Encog - 生產應用程序
- 14. kill -9和生產應用程序
- 15. 在Sinatra應用程序中使用Rails應用程序中的ActiveRecord模型會產生多個警告
- 16. 使用Safari Web Inspector編譯用於生產的應用程序
- 17. 使用Git的Web應用程序開發/生產設置
- 18. 使用Monotouch/Monodroid的任何知名/生產力應用程序
- 19. 爲什麼使用生產開發軌道應用程序
- 20. 誰在生產應用程序中實際使用DataGrid/GridView/FormView/etc?
- 21. 我可以在生產應用程序中使用Telerik Metro Controls Beta嗎?
- 22. 在生產應用程序中使用ASP.NET MVC 2 Preview 1是否可行?
- 23. 我可以在生產應用程序中使用EF Core 2.0嗎?
- 24. 如何在生產中調試Elixir應用程序?
- 25. RuntimeException僅在生產版本中加載應用程序
- 26. 無法在生產中調試Sinatra應用程序
- 27. 如何在生產中部署Owin自託管應用程序?
- 28. Sinatra應用程序在生產中遇到了會話問題
- 29. Go應用程序在生產中運行
- 30. AngularJS應用程序在生產中熱重新加載
的因爲我們的數據庫結構的方式,我們有12桌,我們在一個單一的交易將數據存儲到,因爲這樣在使用SqlBulkCopy的我們得到死鎖錯誤。通過設置SqlBulkCopyOptions.TableLock,死鎖就消失了。鎖定桌子做批量插入有什麼缺點嗎?它會傷害試圖同時運行交易的其他用戶嗎? – PCG 2012-01-06 19:36:05
你的意思是除了你以外還有一個TABLLE LOCK?接下來你會抱怨表鎖;)死鎖是一種不同的事情,並且你的編程很糟糕的一個標誌 - 修復發生的問題,不要將糟糕的代碼放在糟糕的代碼上,以免出現症狀。 – TomTom 2012-01-06 19:50:25
我完全同意你的觀點,如果我沒有產品經理大吼大叫我不想改變關於數據庫模式的一件事情,除了可能有一些索引,並使所有的表現都更好。整個情況我都感到十分慌亂。 – PCG 2012-01-06 20:22:46