我要做幾個插入到一個表中。現在,我列出了迭代的對象列表,對於每個對象,我使用insert語句執行ExecuteNonQuery。幾個插入性能c#
我想知道是否有緊固的方式來做到這一點。 這樣,插入800個寄存器需要幾分鐘的時間。
我在Java中使用了executeBatch方法,對於這個建議,誰在C#中有類似的東西。
問候!
我要做幾個插入到一個表中。現在,我列出了迭代的對象列表,對於每個對象,我使用insert語句執行ExecuteNonQuery。幾個插入性能c#
我想知道是否有緊固的方式來做到這一點。 這樣,插入800個寄存器需要幾分鐘的時間。
我在Java中使用了executeBatch方法,對於這個建議,誰在C#中有類似的東西。
問候!
插入是[比較]快速/便宜行。 提交慢/昂貴。
除非它是一個高延遲連接,多個(如在,數百)插入語句應該很好。
「...需要幾分鐘......」聽起來像交易沒有被使用(因此可能有800次提交 - 哎唷!)。一個控制在C#中交易最簡單的方法是使用TransactionScope:
using (var connection = ...)
using (var tx = new TransactionScope()) {
foreach (var row in rows) {
// insert row
}
// commit all at once
tx.Complete();
}
我只會考慮方法是否限制交易的數量(從而提交)不足以滿足功能要求。
快樂編碼。
你的語句可能是這樣的:
insert into my_table (field1, field2, ...)
values (row1_value1, row2_value2, ...),
(row2_value1, row2_value2, ...), ...
因此,如果您創建例如一個StringBuilder,您可以批了20個,50個或100插入,併發出要少得多插入語句。
如果您想要從.NET應用程序執行所有操作,請查看Performing Batch Operations Using DataAdapters (ADO.NET)。
如果您想獲得最快的性能,可以使用bcp utility(假設您使用的是SQL Server)。您會將數據寫入分隔文件並使用bcp執行插入操作。
如何在由';'分隔的字符串中寫入所有插入語句?並將此字符串傳遞給ExecuteNonQuery?
檢查錯誤只是比較插入的次數與受影響的是的ExecuteNonQuery返回
您也可以創建一個存儲過程,它接收XML參數 –
我已經使用事務作用域(在業務層),所以我認爲只有一個提交時tx.Complete() – Keetah
@Rodrigo只是驗證它真的被使用 - 在幾分鐘內800提交*真的很慢*。我無法想象,即使是過度索引和/或不好的碎片化也會導致這種情況(但我更爲驚訝;-)。還要驗證服務器的延遲是否可以接受; [高]延遲將成爲限制單個命令速度的問題。 (延遲50ms將最大單獨命令/秒減少到約20;因此可能是發送較少單個命令的非常好的候選者。如果相關,將這些信息包括在帖子中。) – 2011-10-14 01:11:32
我正在嘗試通過VPN進程通過互聯網,所以也許是問題。我如何檢查延遲 – Keetah