On Oct 14, 2008, at 4:26 PM, Peter van Hardenberg wrote:
> Hi all,
>
> We're using SQLite to back the media collection in Songbird, and our
> database includes a table which often has a varying set of columns
> updated. At the moment, I'm using a set of prepared statements that
> look like this:
>
> UPDATE table SET columnN = ? WHERE table_id = ?;
>
> I talked with Habbie in IRC (who recommended I post to the list) and
> he advised trying a query like this:
>
> UPDATE table SET
> column1 = CASE 1=? THEN ? ELSE column1 END,
> column2 = CASE 1=? THEN ? ELSE column2 END,
> column3 = CASE 1=? THEN ? ELSE column3 END
> WHERE table_id = ?;
>
> This would theoretically allow me to prepare a single query once and
> to simply bind a "1" and a value to each property I want to change
> with the rest staying the same. Unfortunately, the query executes
> very slowly, about an order of magnitude slower than simply piecing
> together the query as a string each time and compiling it from
> scratch.
I tried the experiment on Linux. I used:
CREATE TABLE t1(a,b,c,d);
-- insert over 1000 rows of data.
UPDATE t1 SET
a = CASE WHEN 1=$ax THEN $av END,
b = CASE WHEN 1=$bx THEN $bv END,
c = CASE WHEN 1=$cx THEN $cv END,
d = CASE WHEN 1=$dx THEN $dv END
WHERE
rowid=$rid
where the bx, bv, cx, cv, dx, and dv values were all unbound and thus
understood as NULL. I prepared the statement once and reused it to do
1000 inserts. The average time was 26.058 milliseconds. Then I did:
UPDATE t1 SET a=$av WHERE rowid=$rid
I prepared the statement separately 1000 times. The average time was
55.458 milliseconds.
Everything was done inside a single transaction.
D. Richard Hipp
[EMAIL PROTECTED]
___
sqlite-users mailing list
sqlite-users@sqlite.org
http://sqlite.org:8080/cgi-bin/mailman/listinfo/sqlite-users