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 でパーティションやその他のオプションを使用することは現在範囲外です。
パフォーマンスを向上させるために休止状態を操作する方法はありますか?