在精简应用程序以挖掘我面临的性能问题后,我有一个非常基本的数据模型。数据模型存在两个实体,例如 callend Product 和 Category:
class Product {
public virtual int ID {get;set;}
public virtual string Name {get;set;}
public virtual int CategoryID {get;set;}
public virtual Category Category {get;set;}
}
class Category {
public virtual int ID {get;set;}
public virtual string Name {get;set;}
}
当我添加 100 个新产品时,所有产品的引用都使用 CategoryID 属性设置为同一类别,我调用 db.SaveChanges() 可能需要相当长的时间。通过将 AutoDetectChangesEnabled 设置为 false,我能够减少所需的时间。但经过几次运行后,我注意到当数据库中存在的产品数量增加时,插入 100 个新产品所需的时间也会增加:
23416 --> +/- 7000 ms
25516 --> +/- 7500 ms
因为我知道表在生产中会变得更大,所以我想知道在我回退到使用原始 Sql 查询或 BulkInsert 之前我的选择是什么。
针对斯坦利和拉斐尔的评论:
在我的测试用例中,ID 属性都是主键,CategoryID 有一个索引。没有触发器等。
我正在执行一个循环 100 次,在其中我初始化一个新的 DbContext,插入 100 个产品并处理 DbContext。
明确一点:我可以创建一个新项目,使用 SqlCe 设置 EF,使用 Code-First 像上面一样构建数据模型并获得相同的结果。
在进行了一些其他测试之后,似乎问题出在 Sql Server Compact Edition 上。使用常规的 MSSQL 服务器,观察到的性能问题消失了,现在插入 100 行始终需要大约 50 毫秒。尽管我现在似乎找到了问题的根源,但它仍然没有回答为什么使用外部查询工具在紧凑型数据库中插入 100 行与使用 EF 插入 100 行时没有相同的性能问题。