[ 
https://issues.apache.org/jira/browse/DERBY-5555?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

Knut Anders Hatlen updated DERBY-5555:
--------------------------------------

    Attachment: derby.log

I could reproduce this in my environment. Actually, the second execution of the 
PreparedStatement failed with an OutOfMemoryError, but the first execution took 
a very long time, as reported.

The query executed with a Statement is:

SELECT ID, MSG FROM ACTIVEMQ_MSGS WHERE CONTAINER='queue://queue' AND ID > 100 
ORDER BY ID

The PreparedStatement executes this query:

SELECT ID, MSG FROM ACTIVEMQ_MSGS WHERE CONTAINER=? AND ID > ? ORDER BY ID

I ran the test case with logging of query plans 
(derby.language.logQueryPlan=true, see the attached derby.log for the detailed 
plans). The first query uses the primary key index on the ID column. The second 
query uses a non-unique index on the CONTAINER column to retrieve the matching 
rows, and then sorts those results.

The optimizer probably makes a guess that the predicate CONTAINER=? won't match 
that many rows, in which case using an index on CONTAINER and sorting would be 
a good strategy. This turns out to be a bad decision when the parameter is set 
to a value that matches every row in the table at execution time.

In the first query, the predicate CONTAINER='queue://queue' is known at prepare 
time to match a high number of rows, so the optimizer avoids making the same 
mistake there.
                
> Execution Time with a Statement 1 ms and with a PreparedStatement about 4 
> minutes
> ---------------------------------------------------------------------------------
>
>                 Key: DERBY-5555
>                 URL: https://issues.apache.org/jira/browse/DERBY-5555
>             Project: Derby
>          Issue Type: Bug
>    Affects Versions: 10.8.1.2, 10.8.2.2
>            Reporter: Steffen Kuche
>         Attachments: derby.log, test.zip
>
>
> Sounds incrediable? Test it by yourself with the attached program.
> The issued reased up because of AMQ-3644, but it is actually a derby problem 
> so I post the issue here as well.
> Derby writes multiple gigabyte of temporary files in its tmp directory during 
> one select statement. Afterwards these temporary files are deleted and 
> rebuild by the next Statement. 
> You can find a Test-Program (import it as a Maven-Eclipse project) which 
> reproduces this issue.
> This program creates a derby database with the activemq Message table and 
> fills it with data (2000 Messages, this can take several hours). I assumed 
> 3MB for one message as our messages contain same binary data and has an 
> average size of 3MB.
> After the database is built one time a Statement and another time a 
> PreparedStatment is used to retrieve the next messages.
> The Statement takes about 1 ms and the PreparedStatement about 258805 ms. 
> Also the second PreparedStatement takes as much time.

--
This message is automatically generated by JIRA.
If you think it was sent incorrectly, please contact your JIRA administrators: 
https://issues.apache.org/jira/secure/ContactAdministrators!default.jspa
For more information on JIRA, see: http://www.atlassian.com/software/jira

        

Reply via email to