2012-02-17 2 views
1

私は大きな表を持ち、多くの列を持っています。異なるユースケースでは、このテーブルから別の列をロードする必要がありますが、通常はすべての列を必要としません。だから私はこの大きなテーブルから必要な列を選択すべきだと思う。例えば問合せの列数を減らしてJPAパフォーマンスを改善する

私はUseCase1のような単純なPOJOを持っていると私は、この名前付きクエリを使用します。私はまた、唯一のA、B、Cの各フィールドを更新し、更新文で

SELECT NEW UseCase1(t.a, t.b, t.c) FROM MyBigTable t 

を。

テーブルを変更できない場合、パフォーマンスを向上させるために、これは良い解決策ですか?これによりパフォーマンスが向上しますか? :)

+1

テーブルにインデックスを追加できますか? – JStead

+0

はい、できますが、インデックスを追加すると、ネットワーク上の送信データ量は変わりません。 – nerd

+0

測定するだけで価値があるかどうかわかります。しかし、通常、これを行うことで多くの利益を得ることはありません。クエリを分析してインデックスを定義し、必要な行だけを返すクエリを使用するようにしてください(通常は非常に悪い考えであるすべての行が選択されます) –

答えて

1

同様の状況がありました。このテクニックを使用して2つのケースでパフォーマンスの向上を確認できます。

  1. テーブルのサイズが40〜50個を超えており、5〜10個の値のみを選択したい場合。
  2. Beanが非レイジーコレクションマッピングを定義している場合。そして、コンストラクタでこのプロパティを避けることが大きな節約になります。(この1つは途方もなく私たちのために働いていた)

@JBは私の一般たit.These 2点を測定することなく確定することができ、我々はパフォーマンス何について話すとき、語っ同様経験。

+0

こんにちはManuPK、最初のケースは私のものです、私は〜40列のテーブルがあり、ほとんどの場合、私はちょうど10-20列が必要です。私は実装段階で途中にあり(古いEntity BeanからJPAへのリファクタリング)、リファクタリングを完了した後にパフォーマンスの最適化を行いたいと思うし、はい、私はmesureをしたい。 :)誰かが同じような状況の経験を持っているかどうかを知りたかっただけです。 – nerd

0

また、@Basic(fetch = LAZY)を使用して、個々の非関連フィールド(例:文字列)を遅延ロードすることもできます。

@Basic(fetch = LAZY) 
private String description; 

このフィールドの表の列はロードされません。フィールドにアクセスするときには、異なるパフォーマンスの問題(N + 1選択)になる可能性がある単一のクエリで遅延ロードされることに注意してください。

関連する問題