2012-01-06 40 views
3

我們目前正在開發一個應用程序,可爲每個用戶會話在特定表中生成5-10,000行數據。目前我們正在使用sql文本命令一次插入每行數據,因此保存操作可能需要一分鐘時間。我們正在玩弄使用SqlBulkInserts,並看到時間下降到不到500毫秒。有沒有人反對在生產應用程序中使用SqlBulkInserts,其中許多用戶將使用該系統?在生產應用程序中使用SqlBulkInsert

回答

6

我從來沒有遇到與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); 
     } 
    } 
} 
1

如果您的應用程序確實需要爲每個會話創建多條記錄,我認爲這是正確的選擇。

+0

的因爲我們的數據庫結構的方式,我們有12桌,我們在一個單一的交易將數據存儲到,因爲這樣在使用SqlBulkCopy的我們得到死鎖錯誤。通過設置SqlBulkCopyOptions.TableLock,死鎖就消失了。鎖定桌子做批量插入有什麼缺點嗎?它會傷害試圖同時運行交易的其他用戶嗎? – PCG 2012-01-06 19:36:05

+0

你的意思是除了你以外還有一個TABLLE LOCK?接下來你會抱怨表鎖;)死鎖是一種不同的事情,並且你的編程很糟糕的一個標誌 - 修復發生的問題,不要將糟糕的代碼放在糟糕的代碼上,以免出現症狀。 – TomTom 2012-01-06 19:50:25

+0

我完全同意你的觀點,如果我沒有產品經理大吼大叫我不想改變關於數據庫模式的一件事情,除了可能有一些索引,並使所有的表現都更好。整個情況我都感到十分慌亂。 – PCG 2012-01-06 20:22:46

2

使用前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類。

+0

我確實接受了這個想法,但是這個方法的問題是我需要爲服務器上的主鍵創建的身份值,因爲我們正在構建一個層次樹,因爲這是一個自引用表。 – PCG 2012-01-06 19:30:55

+0

那又如何?這也完全排除了SqlBulkCopy的使用 - 如果您需要服務器生成的ID,您如何進行批量插入?答案是有效的,你的評價與你自己的陳述相矛盾。 – TomTom 2012-01-06 19:49:28

+0

你的權利和我是一個白癡。我們在SqlBulkCopy實現中所做的工作是檢索我們剛剛在樹的每個級別插入的數據列表,以檢索生成的id列表。我甚至沒有想過用上面提供的陳述來做同樣的事情。 – PCG 2012-01-06 20:20:04

相關問題