【问题标题】:Insert into Table got really slow after having millions of records在拥有数百万条记录后,插入表变得非常慢
【发布时间】:2017-06-18 08:21:52
【问题描述】:

我有一个表结构,基本上是这样的:

UserItems <= Users => UserTransactions 

UserItems 和 USerTransactions 表都包含 UserId FK,它们都已编入索引。

这两个表都包含数百万条记录(上次我检查 UserTransactions 它有大约 1400 万条记录)。

我在尝试插入这些表时遇到了巨大的性能问题和速度下降。

我的插入代码如下所示:

using (var ctx = new mydbEntities())
{
   ctx.Configuration.AutoDetectChangesEnabled = false;
   ctx.Configuration.ValidateOnSaveEnabled = false;
   _listOfUserTransactions; //  List<UserTransactions>
   ctx.BulkInsert(_listOfUserTransactions);
   ctx.SaveChanges(); 
}

假设 _listOfUserTransactions 本身包含 100k 个实体。在表的记录数量较少之前,插入的执行速度非常快......现在它变得非常非常慢,现在使用 BulkInsert 插入 10 万条记录有时需要几个小时......

我不知道该怎么做才能提高插入性能......

你们能帮帮我吗?

【问题讨论】:

  • 我的第一个猜测是检查您在这些表上的索引并尽可能减少它。其次,如果表上的主键是聚集的并且不是标识列,请将其设为非聚集,因为集群需要在插入时重新组织表。
  • @MikeS 您的意思是在 UserItems 中向 UserId FK 添加非聚集索引?
  • @MikeS 您能否详细说明您的答案,我不确定您的意思?如果您可以将此作为答案回复我,以便我可以接受:)
  • 添加有关UserTransactions 表的更多信息。特别有趣的是聚集索引和其他索引。正如 Mike 所写,如果您插入了很多行,但这些行并没有出现在聚集索引的 末尾,这可能会解释问题。同时为 DBMS 添加标签。

标签: sql-server database performance bulkinsert ef-bulkinsert


【解决方案1】:

正如我在评论中提到的:

我的第一个猜测是检查这些表上的索引并尽可能减少它。其次,如果表上的主键是聚集的并且不是标识列,请将其设为非聚集,因为聚集需要在插入时重新组织表。

如果您可以将模式(包括索引)添加到用户事务表的问题中,这将有助于弄清楚发生了什么。任何聚集索引都需要对磁盘上的表数据进行物理重组,因此在表上选择聚集索引时需要注意所选字段的顺序,以尽量减少这种重组。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-04-12
    • 2023-01-31
    • 1970-01-01
    • 2018-02-08
    • 2012-05-30
    • 1970-01-01
    • 2023-01-17
    • 1970-01-01
    相关资源
    最近更新 更多