nHibernate3; 从EAV数据模式中检索4xxx记录.当nHibernate或.NET第一次初始化这些集合时,我们看到了严重的惩罚.后续调用看起来效率更高.在SQL Server Management Studio中运行相同的查询会导致预期的快速返回时间.
使用Fluent和运行时映射代替.hbm.xml; 好奇,如果序列化的映射会有帮助吗?
nHibernate Profiler和log4net日志记录似乎没有让我继续下去.在这个过程中,总共有140,000个实体被水合.
附上我的dotTrace性能跟踪的屏幕截图,显示了集合初始化惩罚:

尝试了加入和渴望fetchtypes,没有明显的结果,但我不是100%肯定我实现了这些 - 只是父母需要如此指定,还是子表也需要被标记?
var products = ((HandleSession)_handleSession).Session.CreateCriteria(typeof(Product))
.SetFetchMode("Product", FetchMode.Eager)
.List<Product>()
.AsEnumerable();
Run Code Online (Sandbox Code Playgroud)
通过web.config启用反射优化器(我认为):

这是花费大部分时间的地方:
return new ProductList(products.Select(p => p.ToProductContract()));
Run Code Online (Sandbox Code Playgroud)
这只是一个执行此操作的扩展方法:
public static ProductContract ToProductContract(this Product product)
{
return new ProductContract
{
Name = product.ProductName,
ProductTypeName = product.ProductType.ProductTypeName,
UpdateTimeStamp = product.UpdateDateTime,
ProductNumber = product.ProductNumber,
Attributes = product.ProductAttributes.ToCommonAttribute().ToList(),
GroupCategories = product.ProductGroups.ToGroupCategory().ToList(),
PublicUniqueId = product.PublicUniqueId
};
}
Run Code Online (Sandbox Code Playgroud)
映射:
internal class ProductMapping : ClassMap<Product>
{
private const string _iscurrentindicator = "IsCurrentIndicator=1";
public ProductMapping()
{
Table("Product"); …Run Code Online (Sandbox Code Playgroud)