2017-01-16 204 views
0

我正在使用Dapper將實時數據源中的數據插入到Sql Server中,因此我關心性能。最近我注意到一些奇怪的東西。
開箱即用,如果您給Dapper一個集合和一個插入查詢,它將觸發每個元素的插入語句。我的測試表明我可以在1秒鐘12場插入有關大致1800對象這樣(只計算connection.Execute(...)運行時間。
現在,我沒有找到小巧玲瓏批量插入功能,並實現了我自己(構建參數列表和SQL查詢)之後,我發現我只能在約3秒內(限於1000行)插入一個批次(再次,只計算connection.Execute(...)調用
因此,這使得我的批次差不多比發送速度慢6倍在一個單獨的查詢每一行。有人可以解釋這樣對我?我認爲人們使用批處理操作,以加快這一進程。
我想插入時間,以1秒之最。 我使用SQL Server 2012標準,該標準是在本地網絡上。我插入的表只在主鍵(這是bigint字段)上有聚簇索引,沒有非聚簇索引和觸發器。
我可以發佈代碼,但沒有什麼特別的通過Dapper進行批量插入比逐行插入要慢

+0

這裏有什麼問題?插入時間太長是1秒?你對一張一張的插入不滿意嗎?在這兩種情況下,爲什麼?根據環境和使用情況,一個接一個都有好處,批量插入也有好處。此外,這是一次性的或反覆出現的,你絕對*有*使用Dapper? – iamdave

+0

@iamdave問題是我需要插入更多來自實時饋送的數據。現在我使用Dapper,它的運行量約爲我計劃用於生產的量的30%。不,它不一定是Dapper,我還沒有嘗試過SqlBulkCopy – chester89

+1

可能值得看看你的自定義批量插入實現。 – grek40

回答

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