2

Ayendeは、 NHibernate Mapping – Inheritanceに関する投稿で、さまざまな NHibernate 継承戦略がどのように機能するかを概説しています。彼の union-subclass の説明は、さまざまなテーブルを結合するサブクエリを使用して生成された SQL を示しています。次に、このサブクエリが選択されます。

私が理解していないのは、このようにマップされたオブジェクトを参照するときに、サブクエリが参照された ID によって制限されない理由です。これは非常に効率が悪いように見えるので、私は心配しています。Companies テーブルと People テーブルのレコード数が増えると、それぞれからすべてを選択するのに時間がかかります。Parties オブジェクトの 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_

2 番目の方法はより効率的で、Company テーブルと People テーブルが大きくなっても適切なインデックス作成が損なわれないことを前提としています。この質問は、私の質問へのさらなる調査によって引き起こされました: how to map a UnionSubclass so that queries generated from it are limited .

4

1 に答える 1

1

最初のクエリの実行プランを確認しましたか?

同様のシナリオで、SQLサーバーはクエリの最適化に驚くほど優れており、テーブル全体(またはインデックス)のスキャンを実行するべきではないことを知っています。通常、クエリされたテーブルの関連するインデックスを検索します。多分それはNHibernateが依存しているものです。これはおそらく他のRDBMSにも当てはまります。

于 2011-11-23T21:31:22.827 に答える