2

Ayende在他关于NHibernate Mapping – Inheritance的帖子中概述了各种 NHibernate 继承策略是如何工作的。他对 union-subclass 的解释显示生成的 SQL 是使用联合各种表的子查询。然后从中选择该子查询。

我不明白为什么在引用以这种方式映射的对象时,子查询不受引用的 id 的限制。我很担心,因为这似乎非常低效。随着公司和人员表中记录数量的增加,从每个表中选择所有内容将需要很长时间。简单地通过 Party 对象的 id 限制子查询将至少从每个表中获取特定记录,而不是所有记录,然后再进行限制。

为了更好地说明这一点,生成的 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 所以从中生成的查询是有限的

4

1 回答 1

1

你检查第一个查询的执行计划了吗?

我发现在类似的场景中,sql server 非常擅长优化查询,并且知道它不应该进行全表(甚至索引)扫描。它通常会找到查询表的相关索引。也许这就是 NHibernate 所依赖的。这可能也适用于其他 RDBMS。

于 2011-11-23T21:31:22.827 回答