You are viewing a plain text version of this content. The canonical link for it is here.
Posted to derby-user@db.apache.org by Paul Sterk <Pa...@Sun.COM> on 2007/05/25 23:03:57 UTC
Derby perf bug?
Team,
I am working with Derby 10.2.2. This SQL query has an unacceptable
performance:
SELECT * FROM registryobject WHERE id IN (SELECT targetObject FROM
association WHERE UPPER(sourceobject) = UPPER(?))
The registryobject table is a UNION of around 20 other tables. When
these tables have several thousand records, the query above runs for a
very long time. AFAIK, this is not a problem on Oracle.
Now, if I break this query into two:
SELECT targetObject FROM association WHERE UPPER(sourceobject) = UPPER(?)
SELECT * FROM registryobject WHERE id IN ('targetObject.id1',
'targetObject.id2', ...)
I get acceptable performance. Is this a bug in derby or something
else? Am I missing something?
Paul
Re: Derby perf bug?
Posted by Army <qo...@gmail.com>.
Dan Karp wrote:
>>I am working with Derby 10.2.2. This SQL query has an unacceptable
>>performance:
>>
>>SELECT * FROM registryobject WHERE id IN (SELECT targetObject FROM
>>association WHERE UPPER(sourceobject) = UPPER(?))
>
> https://issues.apache.org/jira/browse/DERBY-47
>
> Fixed in 10.3.0.0.
Unfortunately, I don't think DERBY-47 is at play here. The query in question
has a subquery within an IN clause, while DERBY-47 added an optimization that
only applies to IN lists with constants and/or parameters. So my guess is that
the DERBY-47 fix will not help for this particular query.
> Is this a bug in derby or something else? Am I missing something?
I think it's "something else": i.e. an opportunity for improved performance of
subqueries in a WHERE clause. Upon quick inspection it looks like this is the
same issue that is described in DERBY-2231--at least, based on the
"testcase1.sql" script attached to that issue. The problem is that, instead of
executing the subquery once and then using the result in the IN clause, Derby
executes the subquery for every row of the outer query, which is really expensive.
> Now, if I break this query into two:
>
> SELECT targetObject FROM association WHERE UPPER(sourceobject) = UPPER(?)
>
> SELECT * FROM registryobject WHERE id IN ('targetObject.id1',
> 'targetObject.id2', ...)
>
> I get acceptable performance.
With this split query approach, you're only executing the subquery one
time--thus you should indeed see better performance. And further, if the second
query uses parameters for the values in the IN list, then that specific query
could potentially benefit from the DERBY-47 changes. But the original query
with the subquery is, I think, a different problem (DERBY-2231).
Army
Re: Derby perf bug?
Posted by Dan Karp <dk...@zimbra.com>.
> I am working with Derby 10.2.2. This SQL query has an unacceptable
> performance:
>
> SELECT * FROM registryobject WHERE id IN (SELECT targetObject FROM
> association WHERE UPPER(sourceobject) = UPPER(?))
>
> Is this a bug in derby or something else? Am I missing something?
https://issues.apache.org/jira/browse/DERBY-47
Fixed in 10.3.0.0.