You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@ofbiz.apache.org by Leon Torres <le...@oss.minimetria.com> on 2007/01/12 23:02:15 UTC

Warning on using EntityOperator.IN with MySQL

Hi folks,

We just got bit by a bug where the results of a query using EntityOperator.IN 
was different from using the equivalent OR expression.

This turned out to be an inconsistency on the party of MySQL.  While we try to 
narrow it down and figure out if it should be reported as a bug to the MySQL 
foks, I thought it would be a good idea to let you all know about this.

The queries are at the bottom of the email.  You can try them yourself if you 
have CRMSFA installed.  Reading the known issues for MySQL at 
http://dev.mysql.com/doc/refman/5.0/en/open-bugs.html I don't notice any 
possible reason why this would happen other than the vague statement,
"Subquery optimization for IN is not as effective as for =."  Perhaps the 
optimizations are suspect.

In any case, I was wondering if we should have the option to make the entity 
engine transform IN conditions into a set of OR conditions instead.  IN seems to 
be slower than OR across databases, so perhaps it would be a nice option to have 
beyond bugs like this.

- Leon


select * from PARTY_RELATIONSHIP where
(role_type_id_from = 'ACCOUNT_TEAM' AND party_id_from IN ('DemoSalesTeam1')
AND party_relationship_type_id = 'ASSIGNED_TO' AND
security_group_id IN ('SALES_MANAGER', 'SALES_REP', 'SALES_REP_LIMITED', 'CSR')
AND ((thru_date IS NULL OR thru_date > '2007-01-12 11:35:58.8') AND (from_date 
IS NULL OR from_date <= '2007-01-12 11:35:58.8')));

select * from PARTY_RELATIONSHIP where
(role_type_id_from = 'ACCOUNT_TEAM' AND party_id_from IN ('DemoSalesTeam1')
AND party_relationship_type_id = 'ASSIGNED_TO' AND
(security_group_id = 'SALES_MANAGER' OR security_group_id = 'SALES_REP' OR 
security_group_id = 'SALES_REP_LIMITED' OR security_group_id = 'CSR')
AND ((thru_date IS NULL OR thru_date > '2007-01-12 11:55:45.34') AND (from_date 
IS NULL OR from_date <= '2007-01-12 11:55:45.34')));

Re: Warning on using EntityOperator.IN with MySQL

Posted by "David E. Jones" <jo...@hotwaxmedia.com>.
On Jan 12, 2007, at 3:02 PM, Leon Torres wrote:

> Hi folks,
>
> We just got bit by a bug where the results of a query using  
> EntityOperator.IN was different from using the equivalent OR  
> expression.

Wow, that is a little scary...

> This turned out to be an inconsistency on the party of MySQL.   
> While we try to narrow it down and figure out if it should be  
> reported as a bug to the MySQL foks, I thought it would be a good  
> idea to let you all know about this.
>
> The queries are at the bottom of the email.  You can try them  
> yourself if you have CRMSFA installed.  Reading the known issues  
> for MySQL at http://dev.mysql.com/doc/refman/5.0/en/open-bugs.html  
> I don't notice any possible reason why this would happen other than  
> the vague statement,
> "Subquery optimization for IN is not as effective as for =."   
> Perhaps the optimizations are suspect.

That sounds like it may be specific to sub-queries, which we don't  
use right now in OFBiz (no one has added support for this in the  
entity engine). It may be referring to the use of IN rather than  
using sub-queries, which is less efficient partially because it  
requires 2 database round-trips, and partially because of what this  
statement is referring to with the database not having it all in one  
go, and so not being able to optimize the query (queries...) as well.

> In any case, I was wondering if we should have the option to make  
> the entity engine transform IN conditions into a set of OR  
> conditions instead.  IN seems to be slower than OR across  
> databases, so perhaps it would be a nice option to have beyond bugs  
> like this.

Hmmm... I'm not sure about IN being slower that OR, where did you  
find that information? I could see it being true perhaps in certain  
databases for a small set of values in the IN, but for larger sets  
I'd be surprised if this were the case.

-David


> - Leon
>
>
> select * from PARTY_RELATIONSHIP where
> (role_type_id_from = 'ACCOUNT_TEAM' AND party_id_from IN  
> ('DemoSalesTeam1')
> AND party_relationship_type_id = 'ASSIGNED_TO' AND
> security_group_id IN ('SALES_MANAGER', 'SALES_REP',  
> 'SALES_REP_LIMITED', 'CSR')
> AND ((thru_date IS NULL OR thru_date > '2007-01-12 11:35:58.8') AND  
> (from_date IS NULL OR from_date <= '2007-01-12 11:35:58.8')));
>
> select * from PARTY_RELATIONSHIP where
> (role_type_id_from = 'ACCOUNT_TEAM' AND party_id_from IN  
> ('DemoSalesTeam1')
> AND party_relationship_type_id = 'ASSIGNED_TO' AND
> (security_group_id = 'SALES_MANAGER' OR security_group_id =  
> 'SALES_REP' OR security_group_id = 'SALES_REP_LIMITED' OR  
> security_group_id = 'CSR')
> AND ((thru_date IS NULL OR thru_date > '2007-01-12 11:55:45.34')  
> AND (from_date IS NULL OR from_date <= '2007-01-12 11:55:45.34')));