我在桌面應用程序中使用實體框架訪問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