加速插入 - 一次插入列表

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。

以上是关于加速插入 - 一次插入列表的主要内容,如果未能解决你的问题,请参考以下文章

SQL中一次插入多条数据

使用 Django 的 ORM 加速批量插入?

入门Mysql命令总结!!!

SQL的INSERT怎么可以一次插入多项数据?

JOOQ 插入记录列表

Django 2021年最新版教程22数据库model 批量插入创建