2012-10-18 74 views
1

我從c#代碼大量批量插入和更新頻繁的內容,我需要儘快完成,請幫助我找到加快此過程的所有方法。針對SQL Server的最佳插入/更新批次

  1. 使用StringBuilder,單獨的語句與;
  2. 不要使用String.FormatStringBuilder.AppendFormat,它的慢則多個StringBuilder.Append生成命令文本調用
  3. 重用SqlCommandSqlConnection
  4. 不要使用SqlParameter S(限制批量大小)
  5. 使用insert into table values(..),values(..),values(..)語法(每行1000行)
  6. 使用盡可能少的索引和約束
  7. 如果可能,使用簡單恢復模式

這裏有問題,幫助更新以上

  1. 名單是什麼語句每命令(每一個ExecuteNonQuery()調用)的最佳數量?
  2. 在同一批次中插入和更新是否好,還是分別執行更好?

我的數據正在被tcp接收,因此請不要建議任何涉及從文件或外部表讀取數據的大容量插入命令。

插入/更新報表率約爲10/3。

回答

2

使用表值參數。當使用大量行時,它們可以很好地擴展,並且您可以獲得接近BCP級別的性能。我在博客中介紹了一種從C#端here中簡化過程的方法。您需要了解的其他信息位於MSDN站點here。你會得到遠遠更好的表現這樣做的事情,而不是做一些正常的SQL批處理小調整。

+0

謝謝,我會盡力去做,並返回結果。 – Anri

+0

我也建議在表上只有一個索引(一個集羣標識),或者可能把它留在堆上。如果您需要其他索引,請先嚐試刪除它們,然後在導入後重新創建它們。 – PseudoToad

+0

謝謝@Gizmo,桌子很大,20列左右。 傳入數據流不斷,我仍然必須在該表上運行選擇,所以沒有意義刪除重新創建索引。 – Anri

0

SqlBulkCopy用於臨時表,然後使用MERGE SQL命令合併數據。

+0

這肯定可能是一個選項,我只是不明白爲什麼不''WriteToServer(DataRow [])'直接到我的表? 因爲我試圖使用表值params,它需要datarows創建反正我會比較這兩種方法的性能。 – Anri

+0

呃,不,我不能用這個,因爲我也需要更新。你可能會建議更新臨時表和合並,但我甚至不需要測試,說它會比TVP慢。 – Anri

+0

你怎麼知道插入/更新? 如果你使用MERGE,你不需要獲取數據來檢查你是否需要更新,只需上傳你得到的和合並。 –