Below are four runs of each version.  The old one is still faster...
Original version:
Run Time: real 126.549 user 0.265202 sys 1.045207
Run Time: real 123.742 user 0.655204 sys 2.776818
Run Time: real 125.947 user 0.795605 sys 4.648830
Run Time: real 130.343 user 1.622410 sys 7.035645

your version:
Run Time: real 165.174 user 0.889206 sys 5.116833
Run Time: real 161.924 user 1.497610 sys 6.146439
Run Time: real 151.702 user 1.544410 sys 7.628449
Run Time: real 149.010 user 1.840812 sys 9.516061

And yes, PSubClass has an INDEX.  Thanks.



-----Original Message----- From: David Raymond
Sent: Friday, October 20, 2017 3:53 PM
To: SQLite mailing list
Subject: Re: [sqlite] Any change to make this query better?

Make sure it gets the same results, but how about something like the below. The collate nocase on the cust field was also a good suggestion.

select
XtraF as PortalID,
ProjID,
A_No as GTXNo,
proj as ProjName,
lang as Target,
QuoteAvailable,
DeliveryDate,
sum(Xtra8) as PriceUSD,
0 as PriceCAD,
sum(ProjFund) as TransferCost,
XtraE as Department,
XtraA as BillTo,
pmuk as Contact,
'-' as Notes1,
'-' as Notes2
from LSOpenJobs as O
inner join
 (select ProjID, max(edate) as QuoteAvailable
 from LSOpenJobs
 where PSubClass = 'QuoteAppr'
 group by ProjID) as I
using (ProjID)
inner join
 (select ProjID, min(edate) as DeliveryDate
 from LSOpenJobs
 where PSubClass = 'Delivery'
 group by ProjID) as E
using (ProjID)
where lower(cust) = 'xerox'
and Xtra9 like '2017-09-%'
group by ProjID, lang
having sum(ProjFund) > 0;

selectid|order|from|detail
1|0|0|SCAN TABLE LSOpenJobs USING INDEX OjPid
2|0|0|SCAN TABLE LSOpenJobs USING INDEX OjPid
0|0|1|SCAN SUBQUERY 1 AS I
0|1|0|SEARCH TABLE LSOpenJobs AS O USING INDEX OjPid (ProjID=?)
0|2|2|SEARCH SUBQUERY 2 AS E USING AUTOMATIC COVERING INDEX (ProjID=?)
0|0|0|USE TEMP B-TREE FOR GROUP BY


Or maybe an index on PSubClass to speed up the subqueries?
sqlite> create index idx1 on LSOpenJobs (PSubClass, ProjID);
selectid|order|from|detail
1|0|0|SEARCH TABLE LSOpenJobs USING INDEX idx1 (PSubClass=?)
2|0|0|SEARCH TABLE LSOpenJobs USING INDEX idx1 (PSubClass=?)
0|0|1|SCAN SUBQUERY 1 AS I
0|1|0|SEARCH TABLE LSOpenJobs AS O USING INDEX OjPid (ProjID=?)
0|2|2|SEARCH SUBQUERY 2 AS E USING AUTOMATIC COVERING INDEX (ProjID=?)
0|0|0|USE TEMP B-TREE FOR GROUP BY


-----Original Message-----
From: sqlite-users [mailto:sqlite-users-boun...@mailinglists.sqlite.org] On Behalf Of jose isaias cabrera
Sent: Friday, October 20, 2017 2:22 PM
To: SQLite mailing list
Subject: [sqlite] Any change to make this query better?


Greetings!

This takes about 1.5 minutes to run with sqlite v3.20.1 with about 200K
records

sqlite> explain query plan
  ...> SELECT
  ...>   O.XtraF AS PortalID,
  ...>   O.ProjID,
  ...>   O.A_No AS GTXNo,
  ...>   O.proj AS ProjName,
  ...>   O.lang AS Target,
  ...>   (SELECT max(edate) from LSOpenJobs AS I WHERE I.ProjID = O.ProjID
AND

  ...>    I.PSubClass = 'QuoteAppr' ) AS QuoteAvailable,
  ...>   (SELECT min(edate) from LSOpenJobs AS E WHERE E.ProjID = O.ProjID
AND

  ...>    PSubClass = 'Delivery') AS DeliveryDate,
  ...>   sum(O.Xtra8) AS PriceUSD,
  ...>   0 AS PriceCAD,
  ...>   sum(O.ProjFund) AS TransferCost,
  ...>   O.XtraE AS Department,
  ...>   O.XtraA AS BillTo,
  ...>   O.pmuk AS Contact,
  ...>   '-' AS Notes1,
  ...>   '-' AS Notes2
  ...>   from LSOpenJobs AS O WHERE lower(cust) = 'xerox' AND
  ...>                         Xtra9 LIKE  '2017-09-%'
  ...>                  GROUP BY ProjID,lang HAVING sum(ProjFund) > 0;
0|0|0|SCAN TABLE LSOpenJobs AS O USING INDEX OjPid
0|0|0|USE TEMP B-TREE FOR GROUP BY
0|0|0|EXECUTE CORRELATED SCALAR SUBQUERY 1
1|0|0|SEARCH TABLE LSOpenJobs AS I USING INDEX OjPid (ProjID=?)
0|0|0|EXECUTE CORRELATED SCALAR SUBQUERY 2
2|0|0|SEARCH TABLE LSOpenJobs AS E USING INDEX OjPid (ProjID=?)
sqlite>



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

Reply via email to