2013-04-02 69 views
0

從C#結束:發送多個插入語句以插入數據庫中的20個或更多行或 將插入語句堆疊到單個字符串中,執行該sql字符串。哪個更有效率?什麼是優點和缺點?發送多個插入語句並在單個字符串中堆疊插入語句併爲更多數據執行該字符串之間的區別

E.g:

for(int i=0;i<21;i++) 
{ 
     //Insert command here 
} 

string qry="Insert into table1() values " 
for(int i=0;i<21;i++) 
{ 
    qry+="(values)"; 
} 
+3

給出您引用的每個版本的簡短代碼示例。 –

+0

並修改您的標題,它的可笑長... – walther

回答

2

如果你想執行批量插入操作,我建議你看一下SqlBulkCopy類,這是該具體操作優化的速度明顯更快。相反,如果您只是對數據插入的各種方法的相對性能感到好奇 - 從我的實驗中,使用表值參數與大量臨時插入語句相比具有非常高的性能 - 其中許多「批量插入」 ,就像你提到的那樣。

長話短說 - 你將不得不使用你的數據和模式來衡量最適合你的東西。但我確實推薦TVP和sqlbulkcopy類。

+0

我還是新來的SqlBulkCopy。但是,是否有可能使用SqlBulkCopy將大於5000的數據從c#datatable(不是Sqlserver)複製到sql server數據表? –

+0

這就是字面意義:)它用於插入數百萬條記錄。 –

0

如果要發送一堆插件,你應該極大的提高了工作效率使用事務。

BEGIN; 
INSERT .... ; 
INSERT .... ; 
INSERT .... ; 
INSERT .... ; 
INSERT .... ; 
COMMIT; 

更爲高效,比

INSERT .... ; 
INSERT .... ; 
INSERT .... ; 
INSERT .... ; 
INSERT .... ; 
-1

我使用2種方法(實體框架之外)。如上所述,如果您有大量的記錄> 5000,請使用SqlBulkCopy。沒有比這更快的了。它使用數據表,因此它在處理對象時不是最好的。

我們用於業務對象的另一種選擇是XML。我們的業務對象有一個生成xml的序列化方法...然後我們有一個存儲過程,如下所示。它具有比傳遞字符串更高的子成本,但是您將有sql服務器驗證語法是否正確,列名是否正確等。另外,sql server會緩存執行計劃。通過字符串進行更改時容易出現錯字和問題。

@xDoc XML 

INSERT INTO dbo.Test(Id,Txt) 
SELECT Data.Id,Data.Txt 
FROM 
(SELECT 
    X.Data.value('Id[1]', 'int') AS Id, 
    X.Data.value('Txt[1]', 'tinyint') AS Txt 
FROM @xDoc.nodes('MyRootNode/MyRecord') AS X(Data)) AS Data; 
相關問題