拥有数百万条记录后,插入表格变得非常慢

时间:2017-02-01 14:33:06

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

我有一个基本上看起来像这样的表结构:

UserItems <= Users => UserTransactions 

UserItems和USerTransactions表在其中包含被编入索引的UserId FK。

这两个表都包含数百万个recods(上次我检查过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的100k记录有时需要几个小时......

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

你们能帮帮我吗?

1 个答案:

答案 0 :(得分:0)

正如我的评论所述:

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

如果你可以为你的用户交易表的问题添加模式(包括索引),这将有助于弄清楚发生了什么。群集的任何索引都需要在磁盘上物理重组表数据,因此在表上选择聚簇索引时需要注意选择的字段将按照最小化此重组的顺序。