Почему NHibernate не ограничивает подзапрос объединенного подкласса определенным идентификатором? - PullRequest
2 голосов
/ 23 ноября 2011

Айенде в своем посте на NHibernate Mapping - Inheritance описывает, как работают различные стратегии наследования NHibernate.Его объяснение union-subclass показывает, что SQL, сгенерированный как использующий подзапрос, объединяет различные таблицы.Этот подзапрос затем выбирается из.

Я не понимаю, почему при обращении к объекту, отображенному таким образом, подзапрос не ограничен указанным идентификатором.Я обеспокоен, потому что это кажется ужасно неэффективным.Поскольку количество записей в таблицах «Компании» и «Люди» увеличивается, выбор каждого из них займет много времени.Простое ограничение подзапроса по идентификатору объекта Сторон будет по крайней мере захватывать конкретную запись из каждой таблицы, а не из всех записей, а затем ограничиваться после.*

select this_.Id            as Id2_0_,
       this_.FirstName     as FirstName3_0_,
       this_.CompanyName   as CompanyN1_4_0_,
       this_.clazz_        as clazz_0_
  from (select Id,
               FirstName,
               null        as CompanyName,
               1           as clazz_
          from People
        union all
        select Id,
               null        as FirstName,
               CompanyName,
               2           as clazz_
          from Companies) this_
 where Id = 123

При ссылке на конкретную Сторону, почему сгенерированный SQL не является

select this_.Id            as Id2_0_,
       this_.FirstName     as FirstName3_0_,
       this_.CompanyName   as CompanyN1_4_0_,
       this_.clazz_        as clazz_0_
  from (select Id,
               FirstName,
               null        as CompanyName,
               1           as clazz_
          from People
         where Id = 123
        union all
        select Id,
               null        as FirstName,
               CompanyName,
               2           as clazz_
          from Companies
         where Id = 123) this_

Второй вариант представляется более эффективным и при условии, что растущие таблицы компаний и сотрудников не повредят соответствующей индексации.Этот вопрос был вызван дальнейшими исследованиями моего вопроса: как отобразить UnionSubclass, чтобы сгенерированные из него запросы были ограничены .

1 Ответ

1 голос
/ 24 ноября 2011

Вы проверяли план выполнения первого запроса?

Я обнаружил, что в подобных сценариях сервер sql удивительно хорош в оптимизации запроса и знает, что он не должен выполнять полную таблицу (или даже индекс) сканирование.Обычно он находит соответствующие индексы запрашиваемых таблиц.Может быть, именно на это опирается NHibernate.Это, вероятно, будет применяться и к другим СУБД.

...