This is terrific.
does anybody have something similar for the perl-dbi/SQLite world?

Regards,

[EMAIL PROTECTED]
NCCI
Boca Raton, Florida
561.893.2415
greetings / avec mes meilleures salutations / Cordialmente
mit freundlichen Grüßen / Med vänlig hälsning


                                                                       
                      "Chris                                           
                      Schirlinger"             To:       sqlite-users@sqlite.org
                      <[EMAIL PROTECTED]        cc:                     
                      om.au>                   Subject:  [sqlite] Speeding up 
your SQLite DB (Windows mostly)
                                                                       
                      02/09/2005 07:18                                 
                      PM                                               
                      Please respond to                                
                      sqlite-users                                     
                                                                       
                                                                       




I've been posting a lot on speed and SQLite, just thought I'd dump
the results and findings into one message including a nice example on
how dumb you can get in the hopes no one else falls this low :)

After several weeks of playing with SQlite3 we have finally gotton
what we want out of a DB. For single user apps (I can't talk much
about multi-user, that wasn't what we were doing) SQLite is
fantastic, fast, easy to use and has great functionality. (hell, it's
even fun, I wuuuuv INSERT OR REPLACE INTO)

Here's the various things we discovered to speed up the system the
most. This relates *mostly* to Windows and Delphi enviroments but may
help others:

1) Talk to the SQLite functions directly if you can, ExecSQLing stuff
down to the DB is better than trying to use some faked Locate or Seek
function. Even if you have to change the way you code, I recommend
it.
>From what I experienced, the exported functions from the DLL were
simple to use and did everything you wanted, though perhaps slightly
differently from the Delphi DBE way some people may be used to

I found a simple wrapper class worked better than trying to use a
bunch of componants pretending to be the BDE, but of course, a lot
depends on what you want to do and how confident you are using
exported DLL functions

2) Indexes and DB structure are important. Fairly generic DB rule one
I suppose, but this is an SQL DB, its VITAL you add the indexs you
need, and even MORE important you *DON'T* add the indexs you don't
need.
Plan your DB before hand with n eye that everything has a function,
if you don't use it, don't have it. There is more about this on the
SQLite docs

3) The default cluster size for a Windows NTFS system seems to be
4096 bytes. Setting the SQLite database page size to the same size
will speed up your database on systems where the cluster size is the
same (Note, Linux cluster I believe to 1024 which is the default for
new SQLite databases)
Easiest way to tell your cluster size is to defragment your drive and
analyze. It tells you in there

To set the SQLite page size, create a new *EMPTY* database and do a
    PRAGMA page_size=4096;
Now create your tables immedeatly (if you close down the SQLite
commandline program and reopen the DB, the page size is reset to
1024). The page size must be set before the first table is created.
Once that tables made, you can't change the size

Typing
    PRAGMA page_size;
will tell you what it is currently set at

4) SQLite doesn't support clustered indexes (simply, indexes that
force the data in the database to be physically layed down in the
SAME order as the index needs it to be in.)
This means that if your index is sequential INTEGER, the records are
physically layed out in the database in that INTEGERs order, 1 then 2
then 3.

You can't make a Clustered index, but you CAN sort your data in order
so that any historical data is ordered nicely. Of course, as the
database matures, you lose that, but it helps

Someone else posted this, and it is a nice example to use, so I will.
If you have a table WIBBLE whose field KEY you want to access a lot,
it would be nice if everything was in order. Using the command line
tool, you can create a fake cluster by doing the following:

   create table wibble2 as select * from wibble;
   delete from wibble;
   insert into wibble select * from wibble2 order by key;
   drop table wibble2;

5) Ok, as a reward for reading this far, here is the dumb thing.

Be *VERY, VERY* careful what you name your database, especially the
extension

For example, if you give all your databases the extension .sdb
(SQLite Database, nice name hey?) you discover that the SDB extension
is already associated with APPFIX PACKAGES.

Now, here is the cute part, APPFIX is an executable/package that
Windows XP recognizes, and it will, (emphasis mine) *ADD THE DATABASE
TO THE SYSTEM RESTORE FUNCTIONALITY*

This means, stay with me here, every time you write ANYTHING to the
database, the Windows XP system thinks a bloody executable has
changed and copies your ENTIRE 800 meg database to the system restore
directory....

I recommend something like DB or DAT.

Have fun people and thanks for all the help :)





Reply via email to