【发布时间】: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