db-derby-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "Mike Matrigali (JIRA)" <j...@apache.org>
Subject [jira] Updated: (DERBY-4437) Concurrent inserts into table with identity column perform poorly
Date Fri, 06 Nov 2009 17:22:32 GMT

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

Mike Matrigali updated DERBY-4437:

I would not be surprised if good performance gains could be gotten in this area, as I don't
believe any optimization has happened.  The code definitely predates today's processors and
multi-core machines.

I agree with both your assessments.  

Some work that could be done in this area:

1) The system tries to limit the number of times that it goes single threaded by allocating
     a group of numbers every time it goes to update the system catalog.  This number
     is probably too low for a multicore insert as fast as it can system.  As a test you 
     could try to just bump this number to make sure it helps your app.  A better derby 
     fix would be to make the fix somehow more zero-admin.  Maybe by tracking how 
     often the value is being updated and dynamically bump it up and down.  Up seems
     easy, not exactly sure how to make it go down.    The downside of a big number is
     that values are lost when the system shuts down.

2) The current lock strategy is based on what was available from the lock manager
     when it was implemented.  There may be better options.   What the system really
     wants to do is to do an unlimited wait unless it is waiting on itself.  For a normal
     application that does not do system catalog queries the normal case is that a hit
     on this lock is not going to be a self deadlock.  So a quick fix might be to add a 
     retry, or add a longer wait on the lock.  A best fix would be a new lock manager
     interfaces that allowed it to wait for as long as needed while insuring it was not
     waiting on parent transaction.

> Concurrent inserts into table with identity column perform poorly
> -----------------------------------------------------------------
>                 Key: DERBY-4437
>                 URL: https://issues.apache.org/jira/browse/DERBY-4437
>             Project: Derby
>          Issue Type: Improvement
>          Components: SQL
>    Affects Versions:
>            Reporter: Knut Anders Hatlen
> I have a multi-threaded application which is very insert-intensive. I've noticed that
it sometimes can come into a state where it slows down considerably and basically becomes
single-threaded. This is especially harmful on modern multi-core machines since most of the
available resources are left idle.
> The problematic tables contain identity columns, and here's my understanding of what
> 1) Identity columns are generated from a counter that's stored in a row in SYS.SYSCOLUMNS.
During normal operation, the counter is maintained in a nested transaction within the transaction
that performs the insert. This allows the nested transaction to commit the changes to SYS.SYSCOLUMN
separately from the main transaction, and the exclusive lock that it needs to obtain on the
row holding the counter, can be releases after a relatively short time. Concurrent transactions
can therefore insert into the same table at the same time, without needing to wait for the
others to commit or abort.
> 2) However, if the nested transaction cannot lock the row in SYS.SYSCOLUMNS immediately,
it will give up and retry the operation in the main transaction. This prevents self-deadlocks
in the case where the main transaction already owns a lock on SYS.SYSCOLUMNS. Unfortunately,
this also increases the time the row is locked, since the exclusive lock cannot be released
until the main transaction commits. So as soon as there is one lock collision, the waiting
transaction changes to a locking mode that increases the chances of others having to wait,
which seems to result in all insert threads having to obtain the SYSCOLUMNS locks in the main
transaction. The end result is that only one of the insert threads can execute at any given
time as long as the application is in this state.

This message is automatically generated by JIRA.
You can reply to this email to add a comment to the issue online.

View raw message