我有一个表,其值是基于条件更新的,当我调用
时// use distinct to get the user id's list
var userIds = db.users.distinct("_id", { "DateRegister": { "$gt": new Date(2015, 11, 31) } })
// perform your aggregation with a filtered collection using the list from the above operations
db.items.aggregate([
{ "$match": { "IdUser": { "$in": userIds } } },
{
"$group": {
"_id": "$IdUser",
"count": {
"$sum": { "$cond": [{ "$gt": [ "$IdItem", null ] }, 1, 0 ] }
}
}
},
{
"$group": {
"_id": "$count",
"users": { "$push": "$_id" }
}
},
{
"$project": {
"_id": 0,
"number_of_items": "$_id",
"number_of_users": { "$size": "$users" }
}
}
])
性能下降很大。
我也在设置属性
db.SaveChanges()
仍然没有预期的结果。
编辑1:
db.Configuration.AutoDetectChangesEnabled = false;
db.Configuration.ValidateOnSaveEnabled = false;
答案 0 :(得分:1)
不幸的是,您无法通过Entity Framework和SaveChanges获得良好的性能。
SaveChange为每次记录更新进行数据库往返。因此,如果您目前拥有10,000个帐户,则会执行10k数据库往返。
设置AutoDetectChangesEnabled和ValidateOnSaveEnabled通常是一个非常糟糕的主意,并且不会真正提高性能,因为数据库往返次数是真正的问题。
免责声明:我是该项目的所有者Entity Framework Extensions
此库允许通过执行以下操作来显着提高性能:
示例:
using(var db= new MyEntities())
{
foreach(var acc in myacclist)
{
//will update my account objects here
}
db.BulkSaveChanges();
}
答案 1 :(得分:0)
在字符串构建器中构建更新查询并为每1k记录保存它可以提高我的性能
using (var db = new MyEntities())
{
StringBuilder finalquery = new StringBuilder();
int i = 0;
foreach (var acc in myacclist)
{
i++;
//will update my account objects here
finalquery.Append(stmnt);
if (1 % 1000 = 0) { db.Database.ExecuteSqlCommand(finalquery.ToString()); }
}
db.SaveChanges();
}