Issue Details (XML | Word | Printable)

Key: OPENJPA-134
Type: Bug Bug
Status: Resolved Resolved
Resolution: Fixed
Priority: Major Major
Assignee: Fay Wang
Reporter: Catalina Wei
Votes: 1
Watchers: 3
Operations

If you were logged in you would be able to see more operations.
OpenJPA

Extra unneeded SQL joins for OneToMany relationship with fetch type EAGER

Created: 08/Feb/07 01:47 AM   Updated: 31/Jul/08 10:10 PM
Return to search
Component/s: sql
Affects Version/s: None
Fix Version/s: 0.9.7

Time Tracking:
Not Specified

File Attachments:
  Size
Text File Licensed for inclusion in ASF works openjpa134_3.patch 2008-07-21 02:40 AM Fay Wang 8 kB

Resolution Date: 11/Apr/07 04:26 PM


 Description  « Hide
Running JPAConfiguration default setting for EagerFetchMode (FetchModeValue.EAGER_PARALLEL),
the SQL generated is sub-optimal.
Consider the following entities:

                                     lineitems( OneToMany )
            Order <===========================> OrderItem
                                    order ( ManyToOne )


Case 1: why not combining 2 SQL to 1 SQL ?
=================================================================================================
Order.lineitmes(EAGER):
OrderItem.order(LAZY):

Executing query: select o from Order o
2173 demo TRACE [main] openjpa.jdbc.SQL - <t 1094730048, conn 1318342292> executing prepstmnt 1299336562
SELECT t0.oid, t0.version, t0.amount, t0.customer_countryCode, t0.customer_id, t0.delivered, t0.shipaddr FROM Order t0
2213 demo TRACE [main] openjpa.jdbc.SQL - <t 1094730048, conn 1318342292> [40 ms] spent
2223 demo TRACE [main] openjpa.jdbc.SQL - <t 1094730048, conn 1318342292> executing prepstmnt 1406424020
SELECT t0.oid, t1.lid, t1.version, t1.cost, t1.order_oid, t1.part_partno, t1.quantity FROM Order t0 INNER JOIN OrderItem t1 ON t0.oid = t1.order_oid ORDER BY t0.oid ASC


Case 2: extra unneeded LEFT OUTER JOIN, if eliminated, the selection aliase t2 should change to t1:
=============================================================================================
Order.lineitmes(EAGER):
OrderItem.order(LAZY):

Executing query: select o from Order o left join fetch o.lineitems
2403 demo TRACE [main] openjpa.jdbc.SQL - <t 1094730048, conn 1314410072> executing prepstmnt 1500797300
SELECT t0.oid, t0.version, t0.amount, t0.customer_countryCode, t0.customer_id, t0.delivered, t0.shipaddr, t2.order_oid, t2.lid, t2.version, t2.cost, t2.part_partno, t2.quantity FROM Order t0 LEFT OUTER JOIN OrderItem t1 ON t0.oid = t1.order_oid LEFT OUTER JOIN OrderItem t2 ON t0.oid = t2.order_oid ORDER BY t2.order_oid ASC


Case 3: why not generating 1 SQL ?
==================================================================================================
Order.lineitmes(EAGER):
OrderItem.order(EAGER):

Executing query: select o from Order o
2343 demo TRACE [main] openjpa.jdbc.SQL - <t 1094730048, conn 1318342292> executing prepstmnt 384833264 SELECT t0.oid, t0.version, t0.amount, t0.customer_countryCode, t0.customer_id, t0.delivered, t0.shipaddr FROM Order t0
2383 demo TRACE [main] openjpa.jdbc.SQL - <t 1094730048, conn 1318342292> [40 ms] spent
2393 demo TRACE [main] openjpa.jdbc.SQL - <t 1094730048, conn 1318342292> executing prepstmnt 1722705582
SELECT t0.oid, t1.lid, t1.version, t1.cost, t2.oid, t2.version, t2.amount, t2.customer_countryCode, t2.customer_id, t2.delivered, t2.shipaddr, t1.part_partno, t1.quantity FROM Order t0 INNER JOIN OrderItem t1 ON t0.oid = t1.order_oid LEFT OUTER JOIN Order t2 ON t1.order_oid = t2.oid ORDER BY t0.oid ASC
2393 demo TRACE [main] openjpa.jdbc.SQL - <t 1094730048, conn 1318342292> [0 ms] spent
3134 demo TRACE [main] openjpa.jdbc.SQL - <t 1094730048, conn 1318342292> executing prepstmnt 950548648
SELECT t0.lid, t0.version, t0.cost, t1.oid, t1.version, t1.amount, t1.customer_countryCode, t1.customer_id, t1.delivered, t1.shipaddr, t0.part_partno, t0.quantity FROM OrderItem t0 LEFT OUTER JOIN Order t1 ON t0.order_oid = t1.oid WHERE t0.order_oid = ? [params=(int) 88]
3134 demo TRACE [main] openjpa.jdbc.SQL - <t 1094730048, conn 1318342292> [0 ms] spent


Case 4: duplicate selections and redundant joins
==================================================================================================
Order.lineitmes(EAGER):
OrderItem.order(EAGER):

Executing query: select o from Order o left join fetch o.lineitems
2273 demo TRACE [main] openjpa.jdbc.SQL - <t 1094730048, conn 1307463150> executing prepstmnt 1565154634
SELECT t0.oid, t0.version, t0.amount, t0.customer_countryCode, t0.customer_id, t0.delivered, t0.shipaddr, t2.order_oid, t2.lid, t2.version, t2.cost, t3.oid, t3.version, t3.amount, t3.customer_countryCode, t3.customer_id, t3.delivered, t3.shipaddr, t2.part_partno, t2.quantity FROM Order t0 LEFT OUTER JOIN OrderItem t1 ON t0.oid = t1.order_oid LEFT OUTER JOIN OrderItem t2 ON t0.oid = t2.order_oid LEFT OUTER JOIN Order t3 ON t2.order_oid = t3.oid ORDER BY t2.order_oid ASC

 All   Comments   Work Log   Change History   Subversion Commits      Sort Order: Ascending order - Click to sort in descending order
Patrick Linskey made changes - 15/Feb/07 06:19 PM
Field Original Value New Value
Attachment openjpa-144-patch.jar [ 12351269 ]
Patrick Linskey made changes - 15/Feb/07 06:22 PM
Attachment openjpa-144-patch.jar [ 12351269 ]
Patrick Linskey made changes - 15/Feb/07 06:22 PM
Comment [ I've attached a jar file containing the compiled class. Put this jar ahead of OpenJPA in your classpath.

FTR, the source for the file in question is at https://svn.apache.org/viewvc/incubator/openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/conf/JDBCConfigurationImpl.java ]
Patrick Linskey made changes - 01/Mar/07 01:12 AM
Fix Version/s 0.9.7 [ 12312340 ]
Abe White made changes - 29/Mar/07 04:28 PM
Assignee Abe White [ awhite ]
Michael Dick made changes - 02/Apr/07 07:54 PM
Fix Version/s 0.9.8 [ 12312446 ]
Fix Version/s 0.9.7 [ 12312340 ]
Abe White made changes - 11/Apr/07 04:26 PM
Assignee Abe White [ awhite ]
Status Open [ 1 ] Resolved [ 5 ]
Resolution Fixed [ 1 ]
Michael Dick made changes - 15/Apr/07 02:35 AM
Fix Version/s 0.9.8 [ 12312446 ]
Fix Version/s 0.9.7 [ 12312340 ]
Fay Wang made changes - 21/Jul/08 02:40 AM
Attachment openjpa134_3.patch [ 12386501 ]
Kevin Sutter made changes - 21/Jul/08 01:22 PM
Assignee Fay Wang [ faywang ]