2017-07-26 2 views
1

J'utilise le constructeur JPQL dans mon code. Cela implique des résultats importants, 5024 données récupérées et des objets créés lors de l'exécution de cette requête. Il faut environ 2 minutes pour terminer son exécution. Plusieurs tables sont impliquées pour exécuter cette requête. Je ne pouvais pas utiliser le cache car les données de la base de données seront mises à jour quotidiennement. Est-il possible d'optimiser la vitesse d'exécution?JPQL L'exécution du constructeur prend beaucoup de temps

Ma formation de requête SQL est comme ça,

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

regardé le SQL généré qui est exécuté? et où le temps est-il passé? –

Répondre

0

Eh bien, une option pour vous est de créer table séparée qui contiendrait la suite de cette requête pour toutes les entités et mettre à jour tous les jours (tous les soirs), puis votre requête sur exécuter cette nouvelle table, comme ceci:

"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 "; 

de cette façon, vous ne devez pas faire et se joindre à la commande chaque fois que vous exécutez votre requête, mais seulement une fois par jour lors de la génération nouvelle table. Bien sûr, avec cette approche pour voir les mises à jour de données, vous devrez attendre jusqu'à ce que la nouvelle table soit recréée.

En outre, vous pouvez créer des index sur les champs que vous utilisez dans clause.

+0

Mais ici, je ne trouve aucun retard dans la récupération des données. Mais je suppose que le temps augmente en raison de la création d'objets. Je ne suis pas sûr de ce qui se passe exactement derrière l'écran avec l'utilisation du constructeur JPQL. Mais il semble que chaque objet récupéré soit créé immédiatement. Y a-t-il un travail pour accélérer la création d'objets? – velraj

+0

L'avez vous testé? Avez-vous une sortie de profileur? Vous ne pouvez pas contourner la création d'objet, et c'est très rapide en Java. Je pense que la plupart des opérations de performance lourde dans ce cas est ** Ordre par ** déclaration. – Max

+1

Oui, c'est vrai. Le problème n'est pas avec la création de l'objet. Même lorsque j'utilise une requête native pour aller chercher, cela prend beaucoup de temps. – velraj