加速插入 - 一次插入列表
Posted
技术标签:
【中文标题】加速插入 - 一次插入列表【英文标题】:Speed up insert - Insert list at once 【发布时间】:2017-07-13 11:59:26 【问题描述】:如何在插入多个数据时加快时间?
我从 excel 中获取数据并将它们存储在列表中。在我的循环中,我为每一行打开连接,然后用我的 Insert 函数关闭。插入函数逐行插入数据。有时此操作需要很长时间。我的插入循环是这样的
private void btnSave_Click(object sender, RoutedEventArgs e)
if (cmpList.Count == 0)
MessageBoxHelper.ShowError("List can not be inserted");
return;
foreach (var item in cmpList)
item.StartDate = dpStart.SelectedDate.Value;
item.FinishDate = dpFinish.SelectedDate.Value;
item.Insert();
MessageBoxHelper.ShowInformation("List was inserted successfully!");
comboCampaignType.IsEnabled = true;
我像这样从 excel 中为所有行创建 cmpList
for (int i=0; i<excelRowCount; i++)
Campaign cmp = new Campaign();
cmp.Type = 1;
cmp.PriceP.Amount = double.Parse((string)sheet.GetRow(row).GetCell(1).Value, CultureInfo.InvariantCulture);
cmp.PriceV.Amount = double.Parse((string)sheet.GetRow(row).GetCell(1).Value, CultureInfo.InvariantCulture);
cmp.PriceP.Currency = (string)sheet.GetRow(row).GetCell(2).Value;
cmp.PriceV.Currency = (string)sheet.GetRow(row).GetCell(2).Value;
cmp.MinOrder = Convert.ToDouble((string)sheet.GetRow(row).GetCell(3).Value);
cmpList.Add(cmp);
那么,有没有办法一次插入列表?任何想法如何加快此操作?
【问题讨论】:
什么是cmpList
?一旦我们发现,我们应该能够推荐适当的行动。例如。将集合变成并发集合,并从许多不同的任务中同时插入。根据 cmpList
是什么,甚至可能没有必要将其转换为并发集合。
Inserting multiple rows in mysql的可能重复
@JonathanDavidArndt 你为什么这么认为?
尝试批量更新。
没问题。如果它不是重复的,则它不是重复的。从表面上看,另一个问题与您的问题有一些相同的考虑,但属于不同的技术领域。只是想确保你看到它。
【参考方案1】:
有不同的原因可能会导致性能问题。您正在使用存储过程,这将比在 c# 端使用 sql 语句更快。然而;为每一行创建连接也会很昂贵。您应该考虑保留单个连接并执行插入(请记住避免连接超时)。如果您能够忽略存储过程,您应该遵循批量插入选项,例如 SqlBulkCopy,或者您甚至可以构建自定义 SQL 插入语句,例如每个插入语句 1000 个项目。
既然你说“有时这个操作需要很多时间”,问题可能是数据库服务器负载、约束、触发器等。你应该避免使用过多的触发器和约束,这可能会导致巨大的性能问题。您可以通过暂时关闭约束来检查它,如this post 中所述。
【讨论】:
感谢您的建议!我会寻找 SqlBulkCopy。以上是关于加速插入 - 一次插入列表的主要内容,如果未能解决你的问题,请参考以下文章