這就是這種情況。我有一個域對象Product
這樣的...爲什麼我在MongoDB上使用LINQ會失去性能?
[DataContract]
public class Product : IStorableEntity
{
[DataMember]
public String Id { get; set; }
[DataMember]
public String RemoteId { get; set; }
[DataMember]
public String LanguageId { get; set; }
[DataMember]
public DateTime? CreationDate { get; set; }
[DataMember]
public DateTime? LastUpdate { get; set; }
ETC..ETC...
}
到我的倉庫層,我有以下方法。
public IEnumerable<TElement> Read()
{
var mongoCollection = _mongoDatabase.GetCollection<TElement>(_partitionName);
return mongoCollection.AsQueryable<TElement>();
}
用這種方法我想通過LINQ公開我的存儲庫層而不導出關於技術的信息。
這樣,我可以這樣做:
var _repository = new MyRepositoryFactory<Product>();
var result = _repository.Read().Where(p=>p.RemoteId == "1")
這個查詢需要1或2毫秒。
,而不是...
var _repository = new MyRepositoryFactory<Product>();
var result = _repository.Read().Where(p=>p.RemoteId == "29000")
需要2800毫秒!
我已經正確創建唯一索引與命令
db.products.ensureIndex({"RemoteId":1, unique:true})
注:是的,我也重建索引與.reIndex()
命令
這裏奇怪的事情... 避免LINQ並修改庫中的方法...
public IEnumerable<TElement> Read(string remoteId)
{
var mongoCollection = _mongoDatabase.GetCollection<TElement>(_partitionName);
var query = Query<TElement>.EQ(p => p.RemoteId, remoteId);
return mongoCollection.Find(query);
}
如果然後我調用該方法之前白衣相同的id ..
var _repository = new MyMongoRepository<Product>();
var result = _repository.Read("29000")
花費1或2毫秒。爲什麼??
爲什麼第一種方法會導致性能下降,因爲id增加而不是第二種方式?
Ps。呃...真的對不起我的英語
您是否曾多次運行where(29000)查詢? – 2013-05-08 22:01:58
嘗試將'IEnumerable'更改爲'IQueryable '。我相信你的代碼會導致整個集合被檢索,然後根據檢索到的數據在本地執行where子句。 –
WiredPrairie
2013-05-08 22:08:52
是WiredPrairie!有用! 2瓶啤酒給你! – Payedimaunt 2013-05-09 05:02:51