我在使用NHibernate获取大约18.000个实体的性能时遇到了问题。查询本身只需不到1秒,但总处理时间超过30秒。
我尝试使用无状态会话,这有点帮助(从大约45秒开始)。我不知道如何进一步尝试调试甚至理解为什么要花这么长时间来处理它。
查询只涉及三个实体,它们不是很大,只有两个是多态的,它们之间存在多对一的关系。
这是映射:
<class name="Referencia" polymorphism="explicit" table="SPCO.dbo.vSPCO_Referencias">
<composite-id>
<key-property name="IdArticulo"/>
<key-property name="IdColor" column="P1"/>
</composite-id>
<discriminator type="string" column="TipoReferencia"/>
<property name="Tipo" column="TipoReferencia"/>
<many-to-one name="Articulo" class="Articulo" column="IdArticulo" update="false" insert="false"/>
[...]
</class>
<class name="Articulo" table="SPCO.dbo.vSPCO_Articulos" polymorphism="explicit">
<id name="Id" column="IdArticulo"/>
<discriminator type="string" column="TipoArticulo"/>
<many-to-one name="Familias" column="IdArticulo" update="false" insert="false"/>
[...]
</class>
<class name="ArticuloFamilias" table="SPCO.dbo.vSPCO_Articulos_Familias">
<id name="IdArticulo" column="IdArticulo"/>
<property name="TipoProductoNp" update="false" insert="false"/>
</class>
查询方法(Mercaderia
是来自Referencia
的派生类):
return StatelessSession.QueryOver<Mercaderia>()
.JoinQueryOver(a => a.Articulo)
.JoinQueryOver(a => a.Familias)
.Where(f => f.TipoProductoNp == tipo)
.List();
来自NHibernate Profiler的基准测试: