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

Rick Hillegas updated DERBY-6859:
---------------------------------
    Urgency: Normal  (was: Blocker)

> Apache Derby Database Performance slow with a foreign key
> ---------------------------------------------------------
>
>                 Key: DERBY-6859
>                 URL: https://issues.apache.org/jira/browse/DERBY-6859
>             Project: Derby
>          Issue Type: Bug
>    Affects Versions: 10.11.1.1, 10.12.1.1
>         Environment: windows 7 64 bit
>            Reporter: somebody
>            Priority: Blocker
>
> I have the following schema: TableA Name
> TableB Name
> A foreign key from TableB.Name to TableA.Name
> I insert 2500 records into table B and one record into TableA.
> I then issue the update statement "update TableB set Name = 'new' where Name 
> = 'old'". I then issue the update statement to change TableA.Name from 'old' 
> to 'new' in the same transaction.
> I put timing code just around the update statement for TableB and discovered 
> that with the foreign key it taks 9.7 seconds to perform the update 
> statement. Without the foreign key it takes about 300 milliseconds. Also if i 
> have the FK and then disable it right before the update of TableB and then 
> re-enable it right after the whole test is just as fast as not having the FK 
> in the first place.
> The query plan is completely identical in the above scenarios except for the 
> timings. the timings vary from about 11 to 33 or so in some cases, and the 
> number of indexes goes up by 1 when I have the FK.
> I also discovered that having the FK the whole time and adding an index on 
> Name and one of the boolean columns that isn't even used at all in any of the 
> queries also results in the fast update statement of about 300 milliseconds - 
> 400 milliseconds.
> Also removing some of the columns from TableB that arent't part of the FK or 
> PK of any other table (ie. columns that aren't even used in any of the 
> queries aside from the initial inserts) improves the speed again of the 
> update.
> I have tried pretty much everything and I am not sure why this behaviour is 
> so bad in Derby. I'm only dealing with 2500 rows in the entire table. It 
> should not be this slow to update an index. I tried analyzing the query plans 
> (which are identical except for slower timing stats), I tried forcing 
> updating of statistics. Forcing flushing data to disk for Derby. I tried 
> using an external database browser and running the same update statements (2 
> mentioned above) and got the same slowness. I also tried many other things.
> The behaviour is always consistent with the same test scenarios (eg. disable 
> foreign key before update or not) but it's completely illogical. Why would 
> updating an FK with only 2500 rows be that slow, this makes the database 
> unusable. Why would creating an index on the Name column and a completely 
> unrelated column improve performance.
> Also the "Execute Time: " in the query plan right near the beginning is 
> always a large negative number yet the timestamps below showing the total 
> compile and execute times are correct for what I'm observing If i subtract 
> them off. Is something wrong with Derby? Why is the time negative?
> I'm also on the latest version of Apache Derby 10.12.1.1, which I only tried 
> as a diagnostic step because I was on 10.11.1.1 when i found this behaviour.
> I would really appreciate a lot of help on this one.
> Thanks
> Also please see:
> http://stackoverflow.com/questions/34765186/apache-derby-database-performance-slow-with-a-foreign-key



--
This message was sent by Atlassian JIRA
(v6.3.4#6332)

Reply via email to