[英]Speed up the insert of 70,000 rows (SProc, C#)
我在C#中有70,000個自定義對象的列表,其中包含四個值。 我需要將所有這些插入到SQL Server表中(如果它們尚未存在於另一個表(相同的數據庫)中)。 我目前只有一個SProc插入一條單獨的記錄,並且有一個foreach
循環為列表中的每個項目調用SProc。 插入70,000大約需要14分鍾,這對我來說感覺很慢,是否有更好的方法?
粗略的SProc是:
CREATE Procedure [dbo].[up_UpdateOverrideTable](
@ItemId varchar(100),
@ItemValue1 decimal(8,5),
@ItemValue2 decimal(8,5),
@Source varchar(2)
)
AS
BEGIN
DECLARE @LocItemId varchar(100)
SET @LocItemId = @ItemId
DECLARE @LocItemValue1 decimal(8,5)
SET @LocItemValue1 = @ItemValue1
DECLARE @LocItemValue2 decimal(8,5)
SET @LocItemValue2 = @ItemValue2
DECLARE @LocSource varchar(2)
SET @LocSource = @Source
DELETE FROM OverrideTable WHERE ItemId = @LocItemId
IF EXISTS (SELECT ItemId FROM InitialTable WHERE ItemId = @LocItemId)
INSERT INTO OverrideTable VALUES (@LocItemId, @LocItemValue1, @LocItemValue2, @LocSource)
END
GO
調用此代碼的C#也在下面:
using (SqlConnection conn = GetNewConnection()){
conn.Open();
using (var tran = conn.BeginTransaction()){
using (SqlCommand cmd = new SqlCommand("up_UpdateOverrideTable", conn, tran)){
cmd.CommandType = CommandType.StoredProcedure;
try{
foreach (var item in overrides){
cmd.Parameters.Clear();
// add parameters here
var response = cmd.ExecuteNonQuery();
completedInserts.Add(new OverrideItem(item.Id, Convert.ToBoolean(response)));
}
}
catch (Exception ex){
tran.Rollback();
throw;
}
tran.Commit();
conn.Close();
}
}
}
我在這里想念的東西還是這是我所希望的最好的東西? 我想知道在C#中創建DataTable
是否可以解決問題?
我想知道在C#中創建DataTable是否可以解決問題?
是的,在C#中使用DataTable
是加快操作速度的一步。 然后,您需要按照注釋中的Matt要求將其用作SqlBulkCopy
的數據源。
DataTable source = null;//your data source as a DataTable
SqlBulkCopy bulkCopy = new SqlBulkCopy("your connection string");
bulkCopy.DestinationTableName = "your target table name";
await bulkCopy.WriteToServerAsync(source);
您只有幾個sql命令,這些命令可能會減慢過程響應。
DELETE FROM OverrideTable WHERE ItemId = @LocItemId
IF EXISTS (SELECT ItemId FROM InitialTable WHERE ItemId = @LocItemId)
(確保在ItemId上具有索引) 除非未在數據庫級別進行優化,否則C#代碼將無法執行任何操作。
關於c#代碼,我認為您應該在foreach循環內創建命令。
try{
foreach (var item in overrides)
{
using (SqlCommand cmd = new SqlCommand("up_UpdateOverrideTable", conn, tran))
{
cmd.CommandType = CommandType.StoredProcedure;
// add parameters here
var response = cmd.ExecuteNonQuery();
completedInserts.Add(new OverrideItem(item.Id, Convert.ToBoolean(response)));
}
}
}
catch (Exception ex)
{
tran.Rollback();
throw;
}
tran.Commit();
conn.Close();
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.