我有一个简单的查询,我使用NHibernate和plain(my)SQL:
运行SELECT Col1, Col2, Col3, Col4 FROM Data LIMIT 100000;
查询时间约为250毫秒。
当NHibernate将结果映射到实体列表时,大约需要4.5秒。 当我使用数据集/数据行和行[“Col1”]语法进行映射时,大约需要1.5秒。
我可以在两种方法之间看到的唯一区别是映射逻辑。 我禁用了nhibernate诊断和缓存,我正在使用无状态会话。
我的查询如下:
using (var session = OpenStatelessSession())
{
return session.QueryOver<Data>()
.Take(100000)
.List();
}
我的映射看起来像这样:
Id(x => x.Col1);
Map(x => x.Col2);
Map(x => x.Col3);
Map(x => x.Col4);
如何提高nhibernate的映射性能?也许有些东西我不见了?
答案 0 :(得分:0)
如果你真的有一个需要读取4列数据的应用程序,一次100,000行,性能至关重要,那就不要使用NHibernate。但是,如果这与您的应用程序的典型数据库使用情况不一样,那么它并没有真正告诉您太多。 (这有点像比较摩托车,皮卡车和卡车的四分之一英里速度。)
虽然使用ORM会产生开销,但在实际使用中,您获得的收益远远超过您的损失。缓存(第一级和第二级),延迟加载,查询批处理等都可以提供性能改进,这是您在接近金属时所不能获得的。
已经做了很多努力来将NHibernate与其他ORM和数据访问策略(例如this comparison of NHibernate and EF)进行对比。它们通常是有争议的,根据我使用NHibernate五年的经验,它们几乎没有相关性。
即使您确实找到了需要调整性能的领域,与ORM可以为应用程序开发带来的无数好处和成本节省相比,它通常是一个相对容易且廉价的问题。