Hi,

OpenJPA 1.0.0
Oracle 10g R2

Is there any known performance issues with either self-reference or circular
reference? When I analyze Oracle SQL trace, it reports the CPU and number of
queries way too high for tables which have only < 10 rows!

THE PERSISTENCE CLASSES:

public class Taxonomy ... {
    // ...
    @ManyToOne    // Also tried (fetch = FetchType.LAZY)
    @JoinColumn(name = "root_category_fk")
    private Category rootCategory;    <=== Circular reference
}

public class Category ... {
    @ManyToOne
    @JoinColumn(name = "taxonomy_fk", nullable = false)
    private Taxonomy taxonomy;    <=== Circular reference

    @ManyToOne    // Also tried (fetch = FetchType.LAZY)
    @JoinColumn(name = "parent_category_fk")
    private Category parent;    <=== Self-reference

    @OneToMany(mappedBy = "parent", cascade = CascadeType.ALL)
    private Set<Category> children = new HashSet<Category>();
}

NOTE: There's database index on taxonomy's name and category's taxonomy_fk.

If I executed the following query:
    @NamedQuery(
        name = "Taxonomy.findByName",
        query = "SELECT t " +
                "FROM Taxonomy t " +
                "WHERE t.name = :name"
    )

>From OpenJPA trace:
...> Executing query: [SELECT c FROM Category c WHERE c.labelPath =
:labelPath AND c.taxonomy = :taxonomy] with parameters: {labelPath=/Topic,
taxonomy=id=1, name=TestTaxonomy, ver=1, }
...> executing prepstmnt 23053938 SELECT t0.id, t0.version,
t0.last_updated_by, t0.last_updated_date, t0.label, t0.label_path,
t0.parent_category_fk, t1.id, t1.version, t1.last_updated_by,
t1.last_updated_date, t1.name, t1.root_category_fk FROM category t0,
taxonomy t1 WHERE (t0.label_path = ? AND t0.taxonomy_fk = ?) AND
t0.taxonomy_fk = t1.id(+) [params=(String) /Topic, (long) 1]
...> executing prepstmnt 4368408 SELECT t0.id, t0.version,
t0.last_updated_by, t0.last_updated_date, t0.label, t0.label_path,
t0.parent_category_fk, t1.id, t1.version, t1.last_updated_by,
t1.last_updated_date, t1.name, t1.root_category_fk FROM category t0,
taxonomy t1 WHERE t0.parent_category_fk = ? AND t0.taxonomy_fk = t1.id(+)
[params=(long) 1]

>From the Oracle SQL trace, you can tell it takes too much CPU and number or
queries for 1 taxonomies and 8 categories:

SELECT t0.id, t0.version, t0.last_updated_by, t0.last_updated_date,
t0.label, 
  t0.label_path, t1.id, t1.version, t1.last_updated_by,
t1.last_updated_date, 
  t1.name 
FROM
 category t0, taxonomy t1 WHERE t0.parent_category_fk = :1 AND
t0.taxonomy_fk 
  = t1.id(+)


call     count       cpu    elapsed       disk      query    current       
rows
------- ------  -------- ---------- ---------- ---------- ---------- 
----------
Parse    24698      0.90       0.95          0          0          0          
0
Execute  24823      1.42       1.33          0          4          0          
0
Fetch    24821      6.39       6.68          0     270797          0      
57173
------- ------  -------- ---------- ---------- ---------- ---------- 
----------
total    74342      8.71       8.98          0     270801          0      
57173


Any helps is greatly appreciated.

-Frank

-- 
View this message in context: 
http://www.nabble.com/Is-there-any-known-performance-issues-with-either-self-reference-or-circular-reference--tp17194049p17194049.html
Sent from the OpenJPA Users mailing list archive at Nabble.com.

Reply via email to