I'm no expert, but I believe I recall reading on one of the SQLite
docs that the performance of Joins can be a bit slower than on other
DB systems. Seeing as you have a couple of tables being joined, this
could be the case. I also think I recall reading some posts in this
list about people changing their joins into subselects and gaining
some performance.

Then again, I'm no expert.

// --------------------------------------
Enrique Ramirez Irizarry
Lead Developer
Indie Code Labs
http://www.indiecodelabs.com



On Mon, Oct 27, 2008 at 7:03 AM, L B <[EMAIL PROTECTED]> wrote:
> Hi all,
> I have a 500mb database in access, migrated to sqlite.
>
>
> The structure is:
>
> --this table has 100 records
> CREATE TABLE CATALOGUES
> (
>       IDCATALOGUE INTEGER PRIMARY KEY AUTOINCREMENT,
>       CATALOGUENAME TEXT,
>       IDPERSONALDATA INTEGER,
>       TYPE INTEGER,
>       ACTIVE INTEGER
> );
> CREATE INDEX IDX_CATALOGUES_IDCATALOGUE ON CATALOGUES
> (IDCATALOGUE);
> CREATE INDEX IDX_CATALOGUES_ACTIVE ON CATALOGUES
> (ACTIVE);
> CREATE INDEX IDX_CATALOGUES_TYPE ON CATALOGUES (TYPE);
> CREATE INDEX IDX_CATALOGUES_IDPERSONALDATA ON
> CATALOGUES (IDPERSONALDATA);
> CREATE INDEX IDX_CATALOGUES_IDCATALOGUE ON CATALOGUES
> (IDCATALOGUE);
>
> --this table has 3 000 records
> CREATE TABLE CATALOGUES_PERSONALDATAS
> (
>       IDCC INTEGER PRIMARY KEY AUTOINCREMENT,
>       IDCATALOGUE INTEGER,
>       IDPERSONALDATA INTEGER,
>       AMOUNT INTEGER,
>       REDUCTION TEXT,
>       DTDELIVERED DATETIME,
> );
> CREATE INDEX IDX_CATALOGUES_PERSONALDATAS_DTDELIVERED
>  ON CATALOGUES_PERSONALDATAS
>  (DTDELIVERED);
> CREATE INDEX IDX_CATALOGUES_PERSONALDATAS_IDCC ON
> CATALOGUES_PERSONALDATAS (IDCC);
> CREATE INDEX
> IDX_CATALOGUES_PERSONALDATAS_IDPERSONALDATA ON
> CATALOGUES_PERSONALDATAS (IDPERSONALDATA);
> CREATE INDEX IDX_CATALOGUES_PERSONALDATAS_IDCATALOGUE
> ON CATALOGUES_PERSONALDATAS (IDCATALOGUE);
>
> --this table has 2 500 000 records!!
> CREATE TABLE CRONOCATALOGUES
> (
>       IDCRCA INTEGER PRIMARY KEY AUTOINCREMENT,
>       IDCATALOGUE INTEGER,
>       DT DATETIME,
>       NUMBER INTEGER,
>       DTFROM DATETIME
> );
> CREATE INDEX IDX_CRONOCATALOGUES_DTFROM
>  ON CRONOCATALOGUES
>  (DTFROM);
> CREATE INDEX IDX_CRONOCATALOGUES_IDCATALOGUE ON
> CRONOCATALOGUES (IDCATALOGUE);
>
> --this table has 800 000 records
> CREATE TABLE PERSONALDATAS (
>  IDPERSONALDATA        INTEGER PRIMARY KEY
> AUTOINCREMENT,
>  IDTYPE           INTEGER,
>  NAME          TEXT COLLATE NOCASE
> );
> CREATE INDEX IDX_PERSONALDATAS_IDTYPE
>  ON PERSONALDATAS
>  (IDTYPE);
>
>
>
> I cannot obtain similar performances on sqlite, having
> a 40-50% difference.
> (9 seconds vs. 13 seconds on windows xp, average
> results, after first executions (OS cache) )
>
>
> The query in access is:
>
> --IN ACCESS
> SELECT DISTINCT TBL.*, PERSONALDATAS.NAME
> FROM
> (
> SELECT CATALOGUES.IDCATALOGUE, CATALOGUES.TYPE,
> VENDORS.NAME AS VENDORNAME,
> CATALOGUES.CATALOGUENAME, MAX(CRONOCATALOGUES.DTFROM)
> AS MAXDT
> FROM PERSONALDATAS AS VENDORS INNER JOIN
> CATALOGUES ON VENDORS.IDPERSONALDATA =
> CATALOGUES.IDPERSONALDATA INNER JOIN CRONOCATALOGUES
> ON CATALOGUES.IDCATALOGUE =
> CRONOCATALOGUES.IDCATALOGUE
> WHERE CATALOGUES.ACTIVE=0
> GROUP BY  CATALOGUES.IDCATALOGUE, VENDORS.NAME,
> CATALOGUES.CATALOGUENAME, CATALOGUES.TYPE
> ) AS TBL
>  INNER JOIN CATALOGUES_PERSONALDATAS ON
> (TBL."CATALOGUES.IDCATALOGUE"=CATALOGUES_PERSONALDATAS.IDCATALOGUE)
>  INNER JOIN PERSONALDATAS ON
> (PERSONALDATAS.IDPERSONALDATA=CATALOGUES_PERSONALDATAS.IDPERSONALDATA)
>  WHERE
> CATALOGUES_PERSONALDATAS.DTDELIVERED<TBL."MAXDT"
>  ORDER BY VENDORNAME
>
>
> In sqlite, same query is really to slow (several
> minutes, even if i put an index in the text field
> PERSONALDATAS.NAME).
> So after several tries and days, best performances I
> get is with (but it is still 40% slower):
>
> --IN SQLITE
> SELECT DISTINCT
> TBL3.*, PERSONALDATAS.NAME AS VENDORNAME
> FROM
> (
>        SELECT TBL2.IDCATALOGUE AS IDCATALOGUE, TBL2.TYPE AS
> TYPE, TBL2.IDPERSONALDATA AS IDPERSONALDATA,
> TBL2.MAXDT AS MAXDT, PERSONALDATAS.NAME AS VENDORNAME
>        ,CATALOGUES.CATALOGUENAME AS CATALOGUENAME
>        FROM
>        (
>                SELECT TBL.IDCATALOGUE AS IDCATALOGUE, TYPE,
> IDPERSONALDATA,  TBL.MAXDT AS MAXDT FROM CATALOGUES
>                INNER JOIN
>                (
>                SELECT MAX(DTFROM) AS MAXDT, IDCATALOGUE FROM
> CRONOCATALOGUES
>                GROUP BY IDCATALOGUE
>                ) AS TBL ON CATALOGUES.IDCATALOGUE=TBL.IDCATALOGUE
>                AND CATALOGUES.ACTIVE=0
>        ) AS TBL2
>        INNER JOIN PERSONALDATAS ON TBL2.IDPERSONALDATA =
> PERSONALDATAS.IDPERSONALDATA
>        INNER JOIN CATALOGUES ON TBL2.IDCATALOGUE =
> CATALOGUES.IDCATALOGUE
> ) AS TBL3
>  INNER JOIN CATALOGUES_PERSONALDATAS ON
> TBL3.IDCATALOGUE=CATALOGUES_PERSONALDATAS.IDCATALOGUE
>  INNER JOIN PERSONALDATAS ON
> PERSONALDATAS.IDPERSONALDATA=CATALOGUES_PERSONALDATAS.IDPERSONALDATA
>
>  WHERE CATALOGUES_PERSONALDATAS.DTDELIVERED<TBL3.MAXDT
>  ORDER BY TBL3.VENDORNAME
>
> Cannot find a way to get same performances.
>
> What's wrong with my query?
>
>
> Thanks very much, any suggestion is really
> appreciated!
> LB
>
>
>
>
>
>
> _______________________________________________
> 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

Reply via email to