6

TABLE_PER_CLASS 継承戦略の Hibernate サポートを使用しています。機能的にはうまく機能します。ポリモーフィック クエリが発行されるたびに、Hibernate は 2 つの具体的なクラス A と B に対して「union all」を含む SQL を生成します。生成された SQL の形式は次のとおりです。

select C1, C2, C3 from (
    select C1, C2, C3 from ClassA
  union all
    select C1, C2, C3 from ClassB
)
where 
    C1 == <value>
order by C2
limit 100

このアプローチの問題は、DB 側のパフォーマンスが非常に悪いことです。C1 列が ClassA と ClassB (abstractparent から派生) の共有プロパティであることを考慮すると、Hibernate は両方のサブ select に where 句を挿入し、パフォーマンスを劇的に向上させることができます。例えば、

select C1, C2, C3 from ( 
    select C1, C2, C3 from ClassA where C1 == <value>
    union all
    select C1, C2, C3 from ClassB where C1 == <value>
)
order by C2
limit 100

制限でいくつかの最適化を行うこともできます。DAO レイヤーで Hibernate 基準 API を使用しています。

引数が表示されないため、インターセプター、onPrepareStatment() を使用できませんでした。作業のこの段階で DB 固有の最適化を回避したいため、DB でパーティションやその他のオプションを使用することは現在範囲外です。

パフォーマンスを向上させるために休止状態を操作する方法はありますか?

4

1 に答える 1

0

table-pr-class と多数または巨大なポリモーフィック クエリを使用しないことをお勧めするよりも、データベース間の高いパフォーマンスが必要です。通常は、識別子列の方が適しています。

クラス階層に 3 つ以上のレベルがある場合は、table-pr-class と discrimantor-columns を組み合わせることができることに注意してください。

于 2012-05-23T08:45:44.820 に答える