Return-Path: X-Original-To: apmail-db-derby-dev-archive@www.apache.org Delivered-To: apmail-db-derby-dev-archive@www.apache.org Received: from mail.apache.org (hermes.apache.org [140.211.11.3]) by minotaur.apache.org (Postfix) with SMTP id EBBE24455 for ; Mon, 27 Jun 2011 12:25:12 +0000 (UTC) Received: (qmail 84177 invoked by uid 500); 27 Jun 2011 12:25:12 -0000 Delivered-To: apmail-db-derby-dev-archive@db.apache.org Received: (qmail 84084 invoked by uid 500); 27 Jun 2011 12:25:11 -0000 Mailing-List: contact derby-dev-help@db.apache.org; run by ezmlm Precedence: bulk List-Help: List-Unsubscribe: List-Post: List-Id: Reply-To: Delivered-To: mailing list derby-dev@db.apache.org Received: (qmail 84077 invoked by uid 99); 27 Jun 2011 12:25:11 -0000 Received: from nike.apache.org (HELO nike.apache.org) (192.87.106.230) by apache.org (qpsmtpd/0.29) with ESMTP; Mon, 27 Jun 2011 12:25:11 +0000 X-ASF-Spam-Status: No, hits=-2000.0 required=5.0 tests=ALL_TRUSTED,T_RP_MATCHES_RCVD X-Spam-Check-By: apache.org Received: from [140.211.11.116] (HELO hel.zones.apache.org) (140.211.11.116) by apache.org (qpsmtpd/0.29) with ESMTP; Mon, 27 Jun 2011 12:25:08 +0000 Received: from hel.zones.apache.org (hel.zones.apache.org [140.211.11.116]) by hel.zones.apache.org (Postfix) with ESMTP id 8409C433DC9 for ; Mon, 27 Jun 2011 12:24:47 +0000 (UTC) Date: Mon, 27 Jun 2011 12:24:47 +0000 (UTC) From: "Rick Hillegas (JIRA)" To: derby-dev@db.apache.org Message-ID: <1951298293.43523.1309177487537.JavaMail.tomcat@hel.zones.apache.org> Subject: [jira] [Commented] (DERBY-4437) Concurrent inserts into table with identity column perform poorly MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 7bit X-JIRA-FingerPrint: 30527f35849b9dde25b450d4833f0394 X-Virus-Checked: Checked by ClamAV on apache.org [ https://issues.apache.org/jira/browse/DERBY-4437?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=13055494#comment-13055494 ] Rick Hillegas commented on DERBY-4437: -------------------------------------- Hi Kathey, Right now, derby.language.sequence.preallocator can be set to the name of a class which customizes the preallocation behavior of a sequence/identity. It would require a small amount of extra work to let this property also be set to a number. Thanks. > 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: 10.5.3.0 > Reporter: Knut Anders Hatlen > Assignee: Rick Hillegas > Attachments: D4437PerfTest.java, D4437PerfTest2.java, Experiments_4437.html, derby-4437-01-aj-allTestsPass.diff, derby-4437-02-ac-alterTable-bulkImport-deferredInsert.diff, derby-4437-03-aa-upgradeTest.diff, derby-4437-04-aa-reclaimUnusedValuesOnShutdown.diff, derby-4437-05-aa-pluggablePreallocation.diff, derby-4437-06-aa-selfTuning.diff, insertperf.png, insertperf2.png, prealloc.png > > > 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 happens: > 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. For more information on JIRA, see: http://www.atlassian.com/software/jira