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

Reply via email to