Nicolas Williams wrote:
> On Wed, Feb 02, 2011 at 03:23:49PM -0800, Jeff Rogers wrote:
>
>> SQLite seems to do quite poorly performance-wise with fully-normalized
>> attribute tables like this, when you want to query against multiple
>> attributes. My timing comparisons with postgres show sqlite to be as
>> much as 10x-15x slower than pg.
>>
>> My timing code is at http://paste.tclers.tk/2346
>
> You need an index on props(id) -- you always need an index on columns
> that form a foreign key. SQLite3 requires that if you want to cascade
> deletions.
Ok, that caught me by surprise, but it improved things a lot. With that
index sqlite is now significantly faster than pg on 3 of the tests, but
still similar to or slower than pg on the remaining 2 - in my code, "sx"
and "sx3". (I can't be sure of the exact timings because I can't run
sqlite and the pg server on the same machine)
Any idea why pg does ok on these queries without the extra index -
Maybe they're created by default? SQLIte doesn't create any indexes
automatically on primary key fields or anything else, correct?
> Without that index your joins will use full table scans.
>
> Also, it's better to use FROM table1 t1 JOIN table2 t2 ON t1.col1 =
> t2.col2 than to put the join conditions in the WHERE clause, as that's
> much easier to read. But I can see that you have JOINs using that
> un-indexed column.
I wrote this test code some time ago, I think originally against a
database that didn't support JOIN syntax. I would use that were I
rewriting it now. (I also don't remember exactly what conditions I was
trying to exercise, but I think it was the case where two attributes
each match a large set but the intersection of those sets is small)
Thanks,
-J
>
>> This is a synthetic test, but I ran across the issue in a real
>> application. I'm not sure what else I can do do optimize the queries;
>> using a denormalized table is the only thing that seems to help.
>
> Add the missing index.
>
> Nico
___
sqlite-users mailing list
sqlite-users@sqlite.org
http://sqlite.org:8080/cgi-bin/mailman/listinfo/sqlite-users