2012-05-13 2 views
5

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上でパーティションやその他のオプションを使用することは、現在のところ有効範囲外です。

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

+0

より明確にすることができます - 今すぐ生成されたSQLクエリと、より良いパフォーマンスをもたらすバリアントを与えることができます。 – gkamal

+0

基礎となるデータベースとは何ですか?私はそれが通常、述語をサブセレクトとユニオンにプッシュダウンするので、それはオラクルではないだろうと思うでしょう... 'C1'は両方のテーブルに適切なインデックスを持っていますか? –

+0

C1両方のテーブルにインデックスがあります。我々はそれらの中で複数のDBをサポートすることになるかもしれない、Derby(Pure java)。その結果、現在の焦点は、すべてのデータベースに対して最高のパフォーマンスをもたらすスキーマを定義することです。 – user1392212

答えて

0

私はtable-pr-classや多または多相多相クエリを使用しないことをお勧めします。 discriminatorカラムは通常より良いでしょう。

クラス階層に2つ以上のレベルがある場合は、table-pr-classとdiscrimantor-columnsを組み合わせることができます。

+0

答えをありがとう。しかし、私はそのデータの90%がテーブルを分割することによって必要とされない99%の巨大なテーブルを避けようとしています。 – user1392212

関連する問題