Низкая производительность выборки в NHibernate (даже при быстром запросе)
У меня проблемы с производительностью 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: