Ian,

On 18 Jan 2011, at 16:40, Ian Hardingham wrote:

> In general, my server is too slow.  It has to run many operations a 
> second, and many DB operations, so the exact definition of "too slow" is 
> a little arbitrary.

Nothing in that paragraph implies that the DB speed is a problem, or that this 
specific query is relevant.

For your own sake, measure the performance precisely and accurately so that you 
know how much time is spent in each area of your application. If all you know 
is that the overall performance is slow, you don't know enough. You also need 
to give yourself a target speed that you regard as fast enough, not least so 
you know when to stop working on this and do something else.

Once you know that it is the database that's using most of the time and you 
have identified which queries are using most of that time you can use EXPLAIN 
QUERY PLAN to ask SQLite how it will execute your worst queries; you can use 
that information to make a more informed decision about how best to optimise. 
If any table in the query lacks an appropriate index, it would benefit you to 
add one for instance. It is generally cheaper to run a CREATE INDEX command 
than to redesign your tables/queries/application logic. And make sure you have 
issued ANALYZE at least once since your database took the size/shape it has now.

Chapter 2 of O'Reilly's High Performance MySQL (Finding Bottlenecks: 
Benchmarking and Profiling) is a good introduction to this field.

> I'm intruiged that you feel a pre-computed table is not a good idea.  Is 
> there an expectation that that would not be especially faster than my 
> current method?

It would be faster at query-time than your current method. It would be much 
slower at insert/update time, and more likely to wind up out-of-step with the 
original table and leave inaccurate results. It would consume vast amounts of 
extra space making it less likely that your database will fit in caches 
(because you haven't normalised your schema at all, see below).

Since you have not shown us your schema there is a limited amount anyone on 
this list can comment on: we do not know what indexes you already have, and you 
have not shown us the output of EXPLAIN QUERY PLAN or EXPLAIN for either of the 
queries which concern you.

>From what we can see in the query you posted it seems you have not normalised 
>your database at all. If you stored a table mapping INTEGER PRIMARY KEY 
>playerID numbers to player names with a UNIQUE INDEX over the player names and 
>used the IDs instead of the names in multiturnTable your query would go much 
>faster, even if it required a full-table scan or two. This is because the 
>engine would need to read and compare fewer bytes of data per row to determine 
>if the row was a match. You would get more rows per page and therefore less 
>I/O would be required. The entire database would also be smaller and therefore 
>more likely to fit in the OS and hardware caches in the machine you're using.

Best Regards,

Phil Willoughby
-- 
Managing Director, StrawberryCat Limited

StrawberryCat Limited is registered in England and Wales with Company No. 
7234809.

The registered office address of StrawberryCat Limited is:

107 Morgan Le Fay Drive
Eastleigh
SO53 4JH

_______________________________________________
sqlite-users mailing list
sqlite-users@sqlite.org
http://sqlite.org:8080/cgi-bin/mailman/listinfo/sqlite-users

Reply via email to