[prev in list] [next in list] [prev in thread] [next in thread]
List: sqlite-users
Subject: Re: [sqlite] SQLite Transaction Rate and speed...
From: "Doug" <pa_ng () poweradmin ! com>
Date: 2009-03-09 18:19:27
Message-ID: 006b01c9a0e3$95a552f0$c0eff8d0$ () com
[Download RAW message or body]
Not sure if it would work in your situation, but I got a good performance
boost in a similar situation by essentially queuing all the updates in
memory (not using SQLite), and eventually flushing thousands of queued
updates as a single transaction. Worked great and was simple to implement,
with the caveat that some items were 'processed' but in volatile memory
longer than they might have been otherwise.
Doug
> -----Original Message-----
> From: sqlite-users-bounces@sqlite.org [mailto:sqlite-users-
> bounces@sqlite.org] On Behalf Of VF
> Sent: Sunday, March 08, 2009 3:48 AM
> To: sqlite-users@sqlite.org
> Subject: Re: [sqlite] SQLite Transaction Rate and speed...
>
> Hi SQLite Gurus,
>
> I am a pretty new SQLite user, and looks like (from the research I've
> made
> so far) I am facing a pretty typical problem with the product -
> performing
> millions upserts as fast as possible. The good news is - there's no
> concurrent access involved - it's pretty much a single Perl script
> which
> processes text and inserts into SQLite DB. The bad news - upsert of
> hundreds
> of thousands of rows takes hours (!).
>
> Here's the schema of my table (it's split mod 10):
>
> create table MAPPINGS_$idx (
> key VARCHAR(32) NOT NULL
> , mapping VARCHAR(32) NOT NULL
> , rank CHAR(2) NOT NULL
> , counter INTEGER NOT NULL
> , timeCreated DATE NOT NULL
> , timeModified DATE NOT NULL
> );
> CREATE UNIQUE INDEX MAP_IDX_$idx ON MAPPINGS_$idx (key, mapping);
> CREATE INDEX KEY_IDX_$idx ON MAPPINGS_$idx(key);
>
> I am trying to do an upsert with the following logic:
>
> UPDATE MAPPINGS_$idx
> SET counter = counter + 1
> , timeModified = CURRENT_TIMESTAMP
> WHERE
> key = ? AND
> mapping = ?;
> IF rowcount == 0 -- here tried rowid and other variations, too, it
> still
> fails at he IF
> BEGIN
> INSERT INTO MAPPINGS_$idx (
> key
> , mapping
> , rank
> , counter
> , timeCreated
> , timeModified
> ) values (
> ?
> , ?
> , 1
> , 1
> , CURRENT_TIMESTAMP
> , CURRENT_TIMESTAMP
> )
> END;
>
> Unfortunately, it fails. I ended up having separate update, check the
> number
> of rows modified, and if 0 - do insert in a separate statement. It
> works,
> but painfully slow. Because of this I can't do BEGIN/COMMIT transaction
> from
> the SQL. I am using Perl DBI interface. I made sure Per's AucoCommit is
> turned off, but I am not sure it still prevents SQLite engine to do
> commit
> after each upsert. And 'pragma synchronous=off' doesn't seem to work
> either
> (or else I am using it incorrectly).
>
> Any suggestion would be highly appreciated (ideally with some Perl
> examples).
>
> Thanks in advance, Bobby
>
> _______________________________________________
> sqlite-users mailing list
> sqlite-users@sqlite.org
> http://sqlite.org:8080/cgi-bin/mailman/listinfo/sqlite-users
_______________________________________________
sqlite-users mailing list
sqlite-users@sqlite.org
http://sqlite.org:8080/cgi-bin/mailman/listinfo/sqlite-users
[prev in list] [next in list] [prev in thread] [next in thread]
Configure |
About |
News |
Add a list |
Sponsored by KoreLogic