2017-07-26 12 views
1

私のコードでJPQLコンストラクターを使用しています。このクエリを実行すると大きな結果、5024個のデータが取得され、オブジェクトが作成されます。実行を完了するまでに約2分かかります。このクエリを実行するには複数のテーブルが必要です。 DBデータが毎日更新されるため、私はキャッシュに行くことができませんでした。実行速度を最適化する方法はありますか?その後、JPQLコンストラクターの実行に長時間かかる

私のSQLクエリの形成は

String sql = "SELECT DISTINCT " 
        + "new com.abc.dc.entity.market.LaptopData(vd.segment.id, vd.segment.segmentGroup, " 
        + "vd.segment.segmentName, vd.segment.category, " 
        + "vd.product.make, vd.product.model, vd.product.modelYear) " 
        + "FROM LaptopData vd, Profile p " 
        + "WHERE vd.profile.profileCode = :profileCode " 
        + "AND vd.pk.profileId = p.id " 
        + "Order By vd.segment.segmentGroup, vd.segment.segmentName, vd.product.make, vd.product.model," 
        + " vd.product.modelYear asc"; 
Query query = em.createQuery(sql); 
query.setParameter("profileCode", profileCode); 

@SuppressWarnings("unchecked") 
List<LaptopData> results = query.getResultList(); 

em.clear(); 
return results; 
+0

実行された生成されたSQLを調べましたか?時間はどこに費やされていますか? –

答えて

0

さて、あなたのための1つのオプションは、すべてのエンティティのために、このクエリの結果が含まれており、毎日(毎晩)、それを更新してしまう別のテーブルを作成することで、このようなもので、あなたが参加して、あなたのクエリを実行するたびに発注行う必要はありませんが、1日1回のみ新しいテーブルを生成するとき

"SELECT DISTINCT" 
       + "new com.abc.dc.entity.market.LaptopData(m.id, m.segmentGroup, " 
       + "m.segmentName, m.category, " 
       + "m.make, m.model, m.modelYear) " 
       + "FROM someNewTable m" 
       + "WHERE m.profileCode = :profileCode "; 

この方法:このように、この新しいテーブルにクエリを実行します。データ更新を見るためにこの手法を使うと、新しいテーブルが再作成されるまで待つ必要があります。

また、句で使用しているフィールドにインデックスを作成できます。

+0

しかし、私はここでデータを取得するのに時間がかかることはありません。しかし、私は時間がオブジェクトの作成のために増加すると思います。私は、JPQLコンストラクタの使い方で画面の後ろに何が起こっているのかよくわかりません。しかし、取り出された各行オブジェクトのような音はすぐに作成されます。オブジェクト作成を高速化するための回避策はありますか? – velraj

+0

テストしましたか?プロファイラ出力はありますか?回避策オブジェクトの作成はできませんし、Javaでは非常に高速です。このケースでは、ほとんどのパフォーマンス重い操作は** **ステートメントで** Orderであると私は思う。 – Max

+1

そうですね。問題は、オブジェクトの作成ではありません。フェッチするためにネイティブクエリを使用する場合でも、それは長い時間がかかります。 – velraj

関連する問題