我在桌面应用程序中使用实体框架访问mysql数据库。数据库安装在同一个系统上,而我现在是唯一使用它的系统。为什么DBSet.Find越来越慢?
我有一种方法,检查某个集合docs
中的对象是否已经在数据库中,如果它们不是它们将被添加到数据库中,并且最后会执行DBContext上的保存方法。该方法在我的程序中循环执行多次。
我注意到,即使要查找的对象数量相当恒定(每次大约500次),每次执行该方法时查找速度都会变得越来越慢。可能是什么原因?
代码看起来或多或少是这样的:
TimeSpan timeToFind = new TimeSpan();
foreach (var docFromResult in docs)
{
DateTime operationStart = DateTime.Now;
var existingDocument =
db.VaStDocuments.Find(docFromResult.Id, docFromResult.OwnerId, docFromResult.Year);
timeToFind += DateTime.Now - operationStart;
if (existingDocument != null && docFromResult.Hash.Equals(existingDocument.Hash))
{
continue;
}
if (existingDocument == null)
{
db.VaStDocuments.Add(docFromResult);
}
else if (!docFromResult.Hash.Equals(existingDocument.Hash))
{
existingDocument.Hash = docFromResult.Hash;
existingDocument.IsNew = true;
existingDocument.Text = null;
}
docsForNotification.Add(docFromResult);
}
if (docsForNotification.Any())
{
db.SaveChangesDisplayValidationErrors();
}
因此,它是该文件将无法在数据库中找到这样基本上是唯一的数据库活动在这里查找方法非常罕见的情况。
timetoFind
通常随着方法的每次执行而增加。在20-30个循环之后,从0.5-2s开始到120s。
您追踪的实体列表将会增加,因此您可以尝试避免:'db.VaStDocuments.AsNoTracking()。查找(...)' – DavidG
@DavidG - 任何副作用? – Greg
除了性能提升之外,此代码中没有任何内容。如果你在其他地方使用这些实体,它可能会受到一些影响,但我非常怀疑这一点。 – DavidG