-->
These old forums are deprecated now and set to read-only. We are waiting for you on our new forums!
More modern, Discourse-based and with GitHub/Google/Twitter authentication built-in.

All times are UTC - 5 hours [ DST ]



Forum locked This topic is locked, you cannot edit posts or make further replies.  [ 7 posts ] 
Author Message
 Post subject: @Where with or-clause is slow!
PostPosted: Tue Aug 08, 2006 5:37 am 
Newbie

Joined: Tue Aug 08, 2006 5:00 am
Posts: 6
I have some performance problems when using the @Where annotation. The problem occours when I'm using an or-clause where all elements are true. Example:

@OneToMany(mappedBy = "owner")
@Where(clause ="1=1 or 1=1 or 1=1")
private Set<Building> buildings;

Iterating this collection takes about half a second. Without the @Where-clause it takes less than 50ms. I've tested it several times on three different computers/platforms. In another (a bit more complex) example, the difference is 25 seconds versus 100ms.

The DEBUG-log-files are huge (several MBs) and they may contain confidential information, so it's not feasable for me to attach them.

I'm using Hibernate Annotations v3.2.0.cr1 (and hibernate 3.2.0.cr2) and PostgreSQL v8.1.4 with the 8.1-407.jdbc3 drivers.


Top
 Profile  
 
 Post subject:
PostPosted: Wed Aug 09, 2006 4:38 am 
Newbie

Joined: Tue Aug 08, 2006 5:00 am
Posts: 6
I just discovered an important detail about this bug. If I place parenthesis around the query (as in @Where(query="(1=1 or 1=1 or 1=1)"), there performance problems are gone.

Please let me know if you would like me to make a JIRA issue about it.


Top
 Profile  
 
 Post subject:
PostPosted: Thu Aug 10, 2006 10:33 pm 
Hibernate Team
Hibernate Team

Joined: Sun Sep 14, 2003 3:54 am
Posts: 7256
Location: Paris, France
looks like a DB issue to me. look at the (different) generated SQL and run it. This should raise the difference

_________________
Emmanuel


Top
 Profile  
 
 Post subject:
PostPosted: Fri Aug 11, 2006 4:31 am 
Newbie

Joined: Tue Aug 08, 2006 5:00 am
Posts: 6
It seems like a Hibernate bug to me.

Code executed:

Code:
      
Owner owner = ownerManager.getOwner(1219L);
      
      for (Building building : owner.getBuildings()) {
         System.out.println(building.getName());
      }


Produced SQL without the @Where-annotation:

Hibernate: select owner0_.id as id24_0_, owner0_.name as name24_0_, (...)from ownertable owner0_ where owner0_.id=?

Hibernate: select buildings0_.owner_id as owner11_10_, buildings0_.id as id10_, buildings0_.id as id0_9_, buildings0_.streetName as streetName0_9_, buildings0_.streetNumber as streetNu3_0_9_, (...) left outer join FdvAdministration fdvadminis9_ on buildings0_.id=fdvadminis9_.building_id where buildings0_.owner_id=? order by buildings0_.name asc

DONE.

Here is the produced SQL with the @Where(clause="1=1 OR 1=1") on owner.getBuildings()

Hibernate: select owner0_.id as id24_0_, owner0_.name as name24_0_, (...)from ownertable owner0_ where owner0_.id=?
Hibernate: select buildings0_.owner_id as owner11_10_, buildings0_.id as id10_, buildings0_.id as id0_9_, buildings0_.streetName as streetName0_9_, (...) left outer join FdvAdministration fdvadminis9_ on buildings0_.id=fdvadminis9_.building_id where 1=1 OR 1=1 and buildings0_.owner_id=? order by buildings0_.name asc

Hibernate: select owner0_.id as id24_0_, owner0_.name as name24_0_, (...)from ownertable owner0_ where owner0_.id=?
Hibernate: select owner0_.id as id24_0_, owner0_.name as name24_0_, (...)from ownertable owner0_ where owner0_.id=?
Hibernate: select owner0_.id as id24_0_, owner0_.name as name24_0_, (...)from ownertable owner0_ where owner0_.id=?
Hibernate: select owner0_.id as id24_0_, owner0_.name as name24_0_, (...)from ownertable owner0_ where owner0_.id=?
Hibernate: select owner0_.id as id24_0_, owner0_.name as name24_0_, (...)from ownertable owner0_ where owner0_.id=?
Hibernate: select owner0_.id as id24_0_, owner0_.name as name24_0_, (...)from ownertable owner0_ where owner0_.id=?
Hibernate: select owner0_.id as id24_0_, owner0_.name as name24_0_, (...)from ownertable owner0_ where owner0_.id=?
Hibernate: select owner0_.id as id24_0_, owner0_.name as name24_0_, (...)from ownertable owner0_ where owner0_.id=?
Hibernate: select owner0_.id as id24_0_, owner0_.name as name24_0_, (...)from ownertable owner0_ where owner0_.id=?
Hibernate: select owner0_.id as id24_0_, owner0_.name as name24_0_, (...)from ownertable owner0_ where owner0_.id=?
Hibernate: select owner0_.id as id24_0_, owner0_.name as name24_0_, (...)from ownertable owner0_ where owner0_.id=?
Hibernate: select owner0_.id as id24_0_, owner0_.name as name24_0_, (...)from ownertable owner0_ where owner0_.id=?
Hibernate: select owner0_.id as id24_0_, owner0_.name as name24_0_, (...)from ownertable owner0_ where owner0_.id=?
Hibernate: select owner0_.id as id24_0_, owner0_.name as name24_0_, (...)from ownertable owner0_ where owner0_.id=?
Hibernate: select owner0_.id as id24_0_, owner0_.name as name24_0_, (...)from ownertable owner0_ where owner0_.id=?
Hibernate: select owner0_.id as id24_0_, owner0_.name as name24_0_, (...)from ownertable owner0_ where owner0_.id=?
Hibernate: select owner0_.id as id24_0_, owner0_.name as name24_0_, (...)from ownertable owner0_ where owner0_.id=?
Hibernate: select owner0_.id as id24_0_, owner0_.name as name24_0_, (...)from ownertable owner0_ where owner0_.id=?
Hibernate: select owner0_.id as id24_0_, owner0_.name as name24_0_, (...)from ownertable owner0_ where owner0_.id=?
Hibernate: select owner0_.id as id24_0_, owner0_.name as name24_0_, (...)from ownertable owner0_ where owner0_.id=?
Hibernate: select owner0_.id as id24_0_, owner0_.name as name24_0_, (...)from ownertable owner0_ where owner0_.id=?
Hibernate: select owner0_.id as id24_0_, owner0_.name as name24_0_, (...)from ownertable owner0_ where owner0_.id=?
Hibernate: select owner0_.id as id24_0_, owner0_.name as name24_0_, (...)from ownertable owner0_ where owner0_.id=?
Hibernate: select owner0_.id as id24_0_, owner0_.name as name24_0_, (...)from ownertable owner0_ where owner0_.id=?
Hibernate: select owner0_.id as id24_0_, owner0_.name as name24_0_, (...)from ownertable owner0_ where owner0_.id=?
Hibernate: select owner0_.id as id24_0_, owner0_.name as name24_0_, (...)from ownertable owner0_ where owner0_.id=?
Hibernate: select owner0_.id as id24_0_, owner0_.name as name24_0_, (...)from ownertable owner0_ where owner0_.id=?
Hibernate: select owner0_.id as id24_0_, owner0_.name as name24_0_, (...)from ownertable owner0_ where owner0_.id=?
Hibernate: select owner0_.id as id24_0_, owner0_.name as name24_0_, (...)from ownertable owner0_ where owner0_.id=?
Hibernate: select owner0_.id as id24_0_, owner0_.name as name24_0_, (...)from ownertable owner0_ where owner0_.id=?
Hibernate: select owner0_.id as id24_0_, owner0_.name as name24_0_, (...)from ownertable owner0_ where owner0_.id=?
Hibernate: select owner0_.id as id24_0_, owner0_.name as name24_0_, (...)from ownertable owner0_ where owner0_.id=?
Hibernate: select owner0_.id as id24_0_, owner0_.name as name24_0_, (...)from ownertable owner0_ where owner0_.id=?
Hibernate: select owner0_.id as id24_0_, owner0_.name as name24_0_, (...)from ownertable owner0_ where owner0_.id=?
Hibernate: select owner0_.id as id24_0_, owner0_.name as name24_0_, (...)from ownertable owner0_ where owner0_.id=?
Hibernate: select owner0_.id as id24_0_, owner0_.name as name24_0_, (...)from ownertable owner0_ where owner0_.id=?
Hibernate: select owner0_.id as id24_0_, owner0_.name as name24_0_, (...)from ownertable owner0_ where owner0_.id=?
Hibernate: select owner0_.id as id24_0_, owner0_.name as name24_0_, (...)from ownertable owner0_ where owner0_.id=?
Hibernate: select owner0_.id as id24_0_, owner0_.name as name24_0_, (...)from ownertable owner0_ where owner0_.id=?
Hibernate: select owner0_.id as id24_0_, owner0_.name as name24_0_, (...)from ownertable owner0_ where owner0_.id=?
Hibernate: select owner0_.id as id24_0_, owner0_.name as name24_0_, (...)from ownertable owner0_ where owner0_.id=?
Hibernate: select owner0_.id as id24_0_, owner0_.name as name24_0_, (...)from ownertable owner0_ where owner0_.id=?
Hibernate: select owner0_.id as id24_0_, owner0_.name as name24_0_, (...)from ownertable owner0_ where owner0_.id=?
Hibernate: select owner0_.id as id24_0_, owner0_.name as name24_0_, (...)from ownertable owner0_ where owner0_.id=?
Hibernate: select owner0_.id as id24_0_, owner0_.name as name24_0_, (...)from ownertable owner0_ where owner0_.id=?
Hibernate: select owner0_.id as id24_0_, owner0_.name as name24_0_, (...)from ownertable owner0_ where owner0_.id=?
Hibernate: select owner0_.id as id24_0_, owner0_.name as name24_0_, (...)from ownertable owner0_ where owner0_.id=?
Hibernate: select owner0_.id as id24_0_, owner0_.name as name24_0_, (...)from ownertable owner0_ where owner0_.id=?
Hibernate: select owner0_.id as id24_0_, owner0_.name as name24_0_, (...)from ownertable owner0_ where owner0_.id=?
Hibernate: select owner0_.id as id24_0_, owner0_.name as name24_0_, (...)from ownertable owner0_ where owner0_.id=?
Hibernate: select owner0_.id as id24_0_, owner0_.name as name24_0_, (...)from ownertable owner0_ where owner0_.id=?
Hibernate: select owner0_.id as id24_0_, owner0_.name as name24_0_, (...)from ownertable owner0_ where owner0_.id=?

DONE.

Look at the where-clause when the annotation is used:
1=1 OR 1=1 and buildings0_.owner_id=?, which is the same as:
(1=1 OR (1=1 and buildings0_.owner_id=?) which is a tautology.

Hibernate should probably have placed parenthesis around the where-clause.


Top
 Profile  
 
 Post subject:
PostPosted: Fri Aug 11, 2006 1:55 pm 
Hibernate Team
Hibernate Team

Joined: Sun Sep 14, 2003 3:54 am
Posts: 7256
Location: Paris, France
interesting, is it a where on a @ManyToMany or an @OneToMany @JoinTable?

_________________
Emmanuel


Top
 Profile  
 
 Post subject:
PostPosted: Sat Aug 12, 2006 2:37 am 
Newbie

Joined: Tue Aug 08, 2006 5:00 am
Posts: 6
@OneToMany:


Owner:
Code:
@Entity
@AccessType(value = "field")
@Table(name = "ownertable")
public class Owner {

   @Id
   @GeneratedValue(strategy = GenerationType.SEQUENCE)
   private Long id;

   @OneToMany(mappedBy = "owner")
   @OrderBy("name")
   @Where(clause="1=1 OR 1=1")
   private Set<Building> buildings;

   (...)
}



Building:

Code:
@Entity
@AccessType(value = "field")
public class Building {

   @Id
   @GeneratedValue(strategy = GenerationType.SEQUENCE)
   private Long id;

   @NotNull
   @ManyToOne
   private Owner owner;

   (...)
}


Top
 Profile  
 
 Post subject:
PostPosted: Fri Aug 18, 2006 5:52 pm 
Hibernate Team
Hibernate Team

Joined: Sun Sep 14, 2003 3:54 am
Posts: 7256
Location: Paris, France
This is actually a bug in Hibernate Core
http://opensource.atlassian.com/projects/hibernate/browse/HHH-2015

_________________
Emmanuel


Top
 Profile  
 
Display posts from previous:  Sort by  
Forum locked This topic is locked, you cannot edit posts or make further replies.  [ 7 posts ] 

All times are UTC - 5 hours [ DST ]


You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum

Search for:
© Copyright 2014, Red Hat Inc. All rights reserved. JBoss and Hibernate are registered trademarks and servicemarks of Red Hat, Inc.