TABLE_PER_CLASS継承戦略のためにHibernateサポートを使用しています。それはうまく機能するのが賢明です。このアプローチはDBに本当に悪いパフォーマンスに苦しんでいるHibernateで生成されたunion-subclassの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
問題:ポリモーフィッククエリが発行され、Hibernateは私の2つの具象クラスに対して、「労働組合のすべて」を含むSQLを生成するたびに& B.ザ・は、SQLは、次の形式を持って生成されました側。 Class C1とClassB(抽象親から派生した)の共有プロパティを考慮すると、Hibernateは両方のサブ選択に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 criteria APIを使用しています。
引数が表示されないため、インターセプタonPrepareStatment()を使用できませんでした。 作業のこのフェーズでDB固有の最適化を避けたいので、DB上でパーティションやその他のオプションを使用することは、現在のところ有効範囲外です。
パフォーマンスを向上させるために休止状態を操作する方法はありますか?
より明確にすることができます - 今すぐ生成されたSQLクエリと、より良いパフォーマンスをもたらすバリアントを与えることができます。 – gkamal
基礎となるデータベースとは何ですか?私はそれが通常、述語をサブセレクトとユニオンにプッシュダウンするので、それはオラクルではないだろうと思うでしょう... 'C1'は両方のテーブルに適切なインデックスを持っていますか? –
C1両方のテーブルにインデックスがあります。我々はそれらの中で複数のDBをサポートすることになるかもしれない、Derby(Pure java)。その結果、現在の焦点は、すべてのデータベースに対して最高のパフォーマンスをもたらすスキーマを定義することです。 – user1392212