我正在使用Dapper將實時數據源中的數據插入到Sql Server中,因此我關心性能。最近我注意到一些奇怪的東西。
開箱即用,如果您給Dapper一個集合和一個插入查詢,它將觸發每個元素的插入語句。我的測試表明我可以在1秒鐘12場插入有關大致1800對象這樣(只計算connection.Execute(...)
運行時間。
現在,我沒有找到小巧玲瓏批量插入功能,並實現了我自己(構建參數列表和SQL查詢)之後,我發現我只能在約3秒內(限於1000行)插入一個批次(再次,只計算connection.Execute(...)
調用
因此,這使得我的批次差不多比發送速度慢6倍在一個單獨的查詢每一行。有人可以解釋這樣對我?我認爲人們使用批處理操作,以加快這一進程。
我想插入時間,以1秒之最。 我使用SQL Server 2012標準,該標準是在本地網絡上。我插入的表只在主鍵(這是bigint字段)上有聚簇索引,沒有非聚簇索引和觸發器。
我可以發佈代碼,但沒有什麼特別的通過Dapper進行批量插入比逐行插入要慢
0
A
回答
2
我不確定爲什麼你要使用Dapper Execute擴展方法,如果你想獲得最好的性能。
最佳的性能要插入的最好的免費的方式是直接使用SqlBulkCopy
類。
免責聲明:我的項目Dapper Plus
該項目爲以下操作容易支持的所有者:
- BulkInsert
- BulkUpdate
- BulkDelete
- BulkMerge
例子:
// CONFIGURE & MAP entity
DapperPlusManager.Entity<Order>()
.Table("Orders")
.Identity(x => x.ID);
// CHAIN & SAVE entity
connection.BulkInsert(orders)
.AlsoInsert(order => order.Items);
.Include(x => x.ThenMerge(order => order.Invoice)
.AlsoMerge(invoice => invoice.Items))
.AlsoMerge(x => x.ShippingAddress);
0
理想的批量大小可以從服務器到服務器而異,關鍵因素是記錄,這將影響資源密集型的插入是,你能有多大讓你批你看到之前表現下降。
的關鍵在於快速插入/更新是確保你滿足最小記錄的要求,請看看這個Microsoft White Paper。不要驚慌 - 你不需要閱讀所有內容 - 查看描述符合「最小日誌記錄」條件的表格(你需要與你的DBA交談)。
一旦您儘可能少地記錄日誌,那麼您需要查看SPOOLS的執行計劃,如果批次開始後臺打印到Tempdb,那麼您的打印速度會顯着減慢。關鍵是保持批量小到足以保留在緩衝區(RAM)中。但是,可用的緩衝空間量將取決於其他進程。
注:TABLOCK與TABLOCKX不同。
+0
將調查它。說實話,我已經使用了SqlBulkCopy,它的速度比所有的選擇都快。我可以在少於100毫秒內插入1500行。這對我來說已經足夠了 – chester89
相關問題
- 1. 批量插入行
- 2. 批量插入0行插入
- 3. MYSQL批量插入慢
- 4. 通過插入進行批量刪除 - 完全撤消空間
- 5. 通過REST進行的neo4j批量插入響應無效URI
- 6. 使用groovy Sql進行批量插入?
- 7. 使用NamedParameterJdbcTemplate進行批量插入
- 8. 進行批量插入/更新用
- 9. 在SQLite緩慢批量/批量插入
- 10. 如何對插入進行隊列以創建批量插入
- 11. 批量插入跳過錯誤的行
- 12. 插入行,通過比較兩個表
- 13. 改進批量插入
- 14. 插入:一次插入多行,或逐一插入?
- 15. 通過PHP批量插入MySQL
- 16. 如何使用存儲過程進行MySQL批量插入?
- 17. 批量插入
- 18. 批量插入
- 19. 通過變量插入多行
- 20. 插入或更新通過SQL Server中的行(批量)
- 21. MySQL批量插入插入速度很慢
- 22. Sqlite批量插入速度很慢
- 23. EclipseLink批量插入非常非常慢
- 24. JPA /休眠批量插入緩慢
- 25. 批量/批量插入R
- 26. 在Hibernate中插入多行 - 批量插入
- 27. 批量插入SQL命令不能插入第一行
- 28. Netezza - 插入多行很慢
- 29. 如何讓Neo4JClient執行批量插入
- 30. 執行批量插入時的System.AccessViaolation(Oracle.DataAccess)
這裏有什麼問題?插入時間太長是1秒?你對一張一張的插入不滿意嗎?在這兩種情況下,爲什麼?根據環境和使用情況,一個接一個都有好處,批量插入也有好處。此外,這是一次性的或反覆出現的,你絕對*有*使用Dapper? – iamdave
@iamdave問題是我需要插入更多來自實時饋送的數據。現在我使用Dapper,它的運行量約爲我計劃用於生產的量的30%。不,它不一定是Dapper,我還沒有嘗試過SqlBulkCopy – chester89
可能值得看看你的自定義批量插入實現。 – grek40