[英]reducing insert statement time when dealing with large amount of data
我讀到有關SqlBulkCopy的信息,它可以減少插入大量行時所用時間的方式,我的情況是:我有一個excel文件,希望將其轉換為dataTable,然后將此dataTable發送到存儲過程(希望我無法更改其代碼),將dataTable中的所有行插入數據庫中的sql表
問題是我要插入1萬到5萬行,是否有什么辦法可以減少存儲過程所花費的時間?
最好的方法是使用SqlBulkCopy將數據添加到臨時表中,然后將其提供給存儲的proc。 您將需要編寫一些SQL代碼來進行處理,但是以這種方式執行所帶來的性能好處應該值得付出。
如果創建一個新的存儲過程,那么您將具有在數據庫引擎內部運行所有這些代碼的額外好處,因此您將不會在應用程序和數據庫引擎之間來回切換。
一些代碼:
var importData = new DataSet();
xmlData.Position = 0;
importData.ReadXml(xmlData);
using (var connection = new SqlConnection(myConnectionString))
{
connection.Open();
using (var trans = connection.BeginTransaction())
{
using (var sbc = new SqlBulkCopy(connection, SqlBulkCopyOptions.Default, trans) { DestinationTableName = myTableName })
{
foreach (DataColumn col in importData.Tables[0].Columns)
{
sbc.ColumnMappings.Add(col.ColumnName, col.ColumnName);
}
sbc.WriteToServer(importData.Tables[0]); //table 0 is the main table in this dataset
// Now lets call the stored proc.
var cmd = new SqlCommand("ProcessDataImport", connection)
{
CommandType = CommandType.StoredProcedure
};
cmd.CommandTimeout = 1200;
cmd.ExecuteNonQuery();
trans.Commit();
}
connection.Close();
return null;
}
}
其中XmlData是具有與批量導入匹配的Xml數據的流,而myTableName包含要導入到的表。 記住,進行批量復制時,列名必須匹配100%。 案例也很重要。
該過程看起來像這樣:
CREATE PROCEDURE [ProcessDataImport]
AS
BEGIN
DECLARE @IMPORTCOL INT
WHILE EXISTS (SELECT X FROM TEMPTABLE)
BEGIN
SELECT @IMPORTCOL = (SELECT TOP 1 COLUMN1 FROM TEMPTABLE)
EXEC DOTHEIMPORT @IMPORTCOL
DELETE FROM TEMPTABLE WHERE COLUMN1 = @IMPORTCOL
END
END
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.