Castle ActiveRecord / оптимизация NHibernate - PullRequest
0 голосов
/ 30 декабря 2008

У меня есть следующая структура: сообщение (таблица сообщений) может иметь несколько полей (таблица полей), и каждое поле может иметь несколько подполей (хранящихся в одной и той же таблице «полей» с той лишь разницей, что поля не имеют значений в Столбец "ParentField"). Подполя могут иметь подполя и т. Д., Но это не важно.

Когда я получаю 10 сообщений, каждое из которых содержит 10 полей, а каждое поле имеет 20 подполей, я вижу из файла журнала, что NHibernate генерирует 2000 вызовов SQL. Есть ли способ оптимизировать это?

Спасибо!

Вот один из 2000 операторов SQL, сгенерированных NHibernate:

SELECT   fieldresul0_.MessageResults_ID as MessageR6___2_, 
         fieldresul0_.ID as ID2_, 
         fieldresul0_.ID as ID5_1_, 
         fieldresul0_.Field_ID as Field2_5_1_, 
         fieldresul0_.Name as Name5_1_, 
         fieldresul0_.Value as Value5_1_, 
         fieldresul0_.MessagePosition as MessageP5_5_1_, 
         fieldresul0_.MessageResults_ID as MessageR6_5_1_, 
         fieldresul0_.ParentField_ID as ParentFi7_5_1_, 
         fieldresul1_.ID as ID5_0_, 
         fieldresul1_.Field_ID as Field2_5_0_, 
         fieldresul1_.Name as Name5_0_, 
         fieldresul1_.Value as Value5_0_, 
         fieldresul1_.MessagePosition as MessageP5_5_0_, 
         fieldresul1_.MessageResults_ID as MessageR6_5_0_, 
         fieldresul1_.ParentField_ID as ParentFi7_5_0_ 
FROM     FieldResults fieldresul0_ 
         LEFT OUTER JOIN FieldResults fieldresul1_ 
                      ON fieldresul0_.ParentField_ID=fieldresul1_.ID 
WHERE    fieldresul0_.MessageResults_ID=@p0 
ORDER BY fieldresul0_.MessagePosition

Вот файл сопоставления, который генерирует ActiveRecord:

<?xml version="1.0" encoding="utf-16"?> 
    <hibernate-mapping  auto-import="true" default-lazy="false" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="urn:nhibernate-mapping-2.2">  
      <class name="FieldResult, Data" table="FieldResults"> 
        <id name="ID" access="property" column="ID" type="Int32" unsaved-value="0"> 
          <generator class="native">    
            <param name="sequence">FieldResults_ID</param>  
          </generator>  
        </id>   
        <property name="FieldID" access="property" type="String">   
          <column name="Field_ID"/> 
        </property> 
        <property name="Name" access="property" type="String">  
          <column name="Name"/> 
        </property> 
        <property name="DisplayValue" access="property" type="String">  
          <column name="Value"/>    
        </property> 
        <property name="MessagePosition" access="property" type="Int32">    
          <column name="MessagePosition"/>  
        </property> 
        <many-to-one name="ParentMessage" access="property" class="MessageResult, Data" column="MessageResults_ID" />   
        <many-to-one name="ParentField" access="property" class="FieldResult, Data" column="ParentField_ID" />  
        <bag name="Children" access="property" table="FieldResults" lazy="false" cascade="all" order-by="Field_ID"> 
          <key column="ParentField_ID" />   
          <one-to-many class="FieldResult, Data" /> 
        </bag>  
      </class>  
    </hibernate-mapping>`   

Ответы [ 2 ]

0 голосов
/ 25 февраля 2011

есть способ помочь nhibernate выполнить некоторые более эффективные объединения. явным образом попросите обработчик запросов включить таблицы поиска с помощью «выборки соединения» и получить результаты с помощью HQL и Session.CreateQuery ()

from FieldRestults fr 
left join fetch fr.ParentMessage 
left join fetch fr.ParentField

Оптимизация сумки в другом вопросе, который я сейчас изучаю.

0 голосов
/ 09 января 2009

Я думаю, это была проблема выбора n + 1. Вы пытались загружать, или пользовательский запрос HQL? Я опубликую пример HQL, чтобы обойти это, если у вас нет

...