Dans les projets où Hibernate est mon fournisseur de persistance, je peux émettre des requêtes avec des expressions 'join fetch', et Hibernate va générer un SQL qui reflète: SQL contenant des expressions de jointure utilisant des chemins de comparaison valides. Cependant, EclipseLink émet des instructions SQL avec des plans cartésiens laids, ce qui nuit gravement aux performances. En lisant ce article, il mentionne que la recherche ardente pourrait générer des plans cartésiens, mais il oublie commodément que d'autres fournisseurs (Hibernate) peuvent optimiser cela.EclipseLink génère un plan cartésien au lieu de jointures (internes) dans SQL. Pourquoi?
Alors, est-il possible de demander à EclipseLink d'optimiser ces requêtes? Je crois que peu de relations peuvent être optimisées grâce à l'utilisation de l'annotation @FetchJoin, mais j'espère trouver quelque chose qui n'inclut pas la diffusion d'annotations spécifiques à ORM sur le modèle de domaine.
À titre d'exemple, voici une requête (dynamique) que je lance comme JPQL:
String query = "select w from WorkOrder w " +
"inner join fetch w.type " +
"inner join fetch w.details " +
"inner join fetch w.project " +
"inner join fetch w.priority " +
"inner join fetch w.networkElement ";
Et voici la sortie EclipseLink:
SELECT t1.ID, t1.CREATION, ... (the fetch fields here)
FROM swa_network_element t5, swa_priorities t4, swa_dispatch_project t3, swa_work_order_detail t2, swa_work_orders t1, swa_work_order_type t0
WHERE ((t1.alpha_id LIKE '%TSK%') AND (((((t0.ID = t1.TYPE_ID) AND (t2.worder_id = t1.ID)) AND (t3.id = t1.project_id)) AND (t4.ID = t1.priority_id)) AND (t5.ID = t1.ne_id))) ORDER BY t1.CREATION DESC
Meilleures salutations, Rodrigo Hartmann
Essayé affichage sur les forums EclipseLink, mais n'a obtenu aucune réponse là aussi. Sujet délicat? – javabeats
Trouvé votre question creusant dans le même problème. Hacking dessus aujourd'hui, postera si je trouve quelque chose. – Freiheit
Mon DBA m'a dit que si EclipseLink rejoignait les tables sur la clause WHERE, en ce qui concerne $ QL $ erver, cela n'aurait aucun impact particulier sur les performances de la requête. J'ai vu ses tests, et j'étais satisfait des résultats. Le seul problème restant est maintenant quand EclipseLink ajoute la même table * deux fois * sans raison valable. Pour ces requêtes particulières, j'ai dû utiliser des critères pour obtenir un résultat satisfaisant. Parfois, comme ça, Hibernate me manque. – javabeats