Hi Brett, Many thanks for replying. Well I tried PRAGMA temp_store=memory and that sadly did not help.
I'm going to adopt a different approach. Say I've got: select a,b,c from d where c NOT IN (select c from e) What I'm trying is: 1. select a,b,c from d into a temp1 table (as far as I can see SQLite can't do SELECT INTO, so I'll do it for it by creating the table and selecting and inserting the rows - please correct me if there's an easier way). 2. select c from e into a second temp2 table 3. delete from temp1 where temp1.c = temp2.c 4. the results left in temp1 will be the rows where c NOT IN (select c from e) [hopefully :-] I used to do this with Sybase back in the days when Sybase was really bad with NOT IN too - they seemed to improve on things around version 12 or 12.5... Thanks, David Carter-Hitchin. -- Royal Bank of Scotland Interest Rate Derivatives IT 135 Bishopsgate LONDON EC2M 3TP Tel: +44 (0) 207 085 1088 > -----Original Message----- > From: Brett Wilson [mailto:[EMAIL PROTECTED] > Sent: 14 March 2006 16:48 > To: sqlite-users@sqlite.org > Subject: Re: [sqlite] Help needed to diagnose "NOT IN" query > > > David, > > I asked a similar question, and here is drh's response to me, adapted > to your situation. I think it is probably applicable to you as well. > I'm not sure this is the type of query that can be made to go really > fast no matter what. I actually haven't gotten around to doing this > yet, so I can't comment on how well it works. > > > To implement this, SQLite creates a temporary index that contains all > unique values of holiday_list.number. Then it scans through the table > and for each entry where holiday.hol_id is not in the temp index. > > Do make sure that your temp tables are stored in RAM. Compile with > -DTEMP_STORE=2. Or at run-time set > > PRAGMA temp_store=memory; > > That will put the temporary index in RAM and things will tend > to go faster. > > Brett > > On 3/14/06, CARTER-HITCHIN, David, FM > <[EMAIL PROTECTED]> wrote: > > Hi, > > > > Hope someone out there can help - I've got this query which > runs VERY > > slowly: > > > > SELECT ab_tran.ins_num, holiday.hol_id, holiday.ins_num > > FROM ab_tran, holiday > > WHERE ab_tran.ins_num = holiday.ins_num > > AND holiday.hol_id NOT IN ( SELECT number from holiday_list ) > > > > All the tables are fairly chunky, except holiday_list which > has 89 rows. I > > just realised that holiday.ins_num is needlessly selected > but I doubt very > > much that would be causing things to slow down massively. > I can run this on > > a similar powered Sybase server and it runs in a couple of > minutes - with > > SQLite, using an in-memory database I've left it all night > and it didn't > > finish! Evidently something is wrong somewhere. I've > created indexes on > > all the columns in the join and the "NOT IN" clause, but > that didn't seem to > > help. > > > > Is there anything else I check? > > > > I've run the EXPLAIN (output below), but I'm a novice here, > not sure what > > could be wrong. > > > > Any ideas will be highly appreciated. > > > > Tue Mar 14 12:05:10 2006 DEBUG at Cache.cpp:476 - 64 rows > extracted in > > 0.03532 seconds. > > Tue Mar 14 12:05:10 2006 DEBUG at Cache.cpp:487 - 0 > Goto 0 60 > > Tue Mar 14 12:05:10 2006 DEBUG at Cache.cpp:487 - 1 > Integer 0 0 > > Tue Mar 14 12:05:10 2006 DEBUG at Cache.cpp:487 - 2 > OpenRead 0 > > 3 > > Tue Mar 14 12:05:10 2006 DEBUG at Cache.cpp:487 - 3 > SetNumColumns 0 > > 7 > > Tue Mar 14 12:05:10 2006 DEBUG at Cache.cpp:487 - 4 > Integer 0 0 > > Tue Mar 14 12:05:10 2006 DEBUG at Cache.cpp:487 - 5 > OpenRead 1 > > 5 > > Tue Mar 14 12:05:10 2006 DEBUG at Cache.cpp:487 - 6 > SetNumColumns 1 > > 2 > > Tue Mar 14 12:05:10 2006 DEBUG at Cache.cpp:487 - 7 > Integer 0 0 > > Tue Mar 14 12:05:10 2006 DEBUG at Cache.cpp:487 - 8 > OpenRead 3 > > 137675 keyinfo(1,BINARY) > > Tue Mar 14 12:05:10 2006 DEBUG at Cache.cpp:487 - 9 > Rewind 0 56 > > Tue Mar 14 12:05:10 2006 DEBUG at Cache.cpp:487 - 10 > Column 0 1 > > Tue Mar 14 12:05:10 2006 DEBUG at Cache.cpp:487 - 11 > NotNull -1 14 > > Tue Mar 14 12:05:10 2006 DEBUG at Cache.cpp:487 - 12 Pop > 1 0 > > Tue Mar 14 12:05:10 2006 DEBUG at Cache.cpp:487 - 13 > Goto 0 55 > > Tue Mar 14 12:05:10 2006 DEBUG at Cache.cpp:487 - 14 > MakeRecord 1 > > 0 i > > Tue Mar 14 12:05:10 2006 DEBUG at Cache.cpp:487 - 15 > MemStore 0 > > 0 > > Tue Mar 14 12:05:10 2006 DEBUG at Cache.cpp:487 - 16 > MoveGe 3 55 > > Tue Mar 14 12:05:10 2006 DEBUG at Cache.cpp:487 - 17 > MemLoad 0 0 > > Tue Mar 14 12:05:10 2006 DEBUG at Cache.cpp:487 - 18 > IdxGE 3 55 > > + > > Tue Mar 14 12:05:10 2006 DEBUG at Cache.cpp:487 - 19 > RowKey 3 0 > > Tue Mar 14 12:05:10 2006 DEBUG at Cache.cpp:487 - 20 > IdxIsNull 1 > > 54 > > Tue Mar 14 12:05:10 2006 DEBUG at Cache.cpp:487 - 21 > IdxRowid 3 > > 0 > > Tue Mar 14 12:05:10 2006 DEBUG at Cache.cpp:487 - 22 > MoveGe 1 0 > > Tue Mar 14 12:05:10 2006 DEBUG at Cache.cpp:487 - 23 > MemLoad 1 0 > > Tue Mar 14 12:05:10 2006 DEBUG at Cache.cpp:487 - 24 If > 0 40 > > Tue Mar 14 12:05:10 2006 DEBUG at Cache.cpp:487 - 25 > MemInt 1 1 > > Tue Mar 14 12:05:10 2006 DEBUG at Cache.cpp:487 - 26 > OpenVirtual 4 > > 0 keyinfo(1,BINARY) > > Tue Mar 14 12:05:10 2006 DEBUG at Cache.cpp:487 - 27 > SetNumColumns 4 > > 1 > > Tue Mar 14 12:05:10 2006 DEBUG at Cache.cpp:487 - 28 > Integer 0 0 > > Tue Mar 14 12:05:10 2006 DEBUG at Cache.cpp:487 - 29 > OpenRead 2 > > 6 > > Tue Mar 14 12:05:10 2006 DEBUG at Cache.cpp:487 - 30 > SetNumColumns 2 > > 1 > > Tue Mar 14 12:05:10 2006 DEBUG at Cache.cpp:487 - 31 > Rewind 2 39 > > Tue Mar 14 12:05:10 2006 DEBUG at Cache.cpp:487 - 32 > Column 2 0 > > Tue Mar 14 12:05:10 2006 DEBUG at Cache.cpp:487 - 33 > NotNull -1 36 > > Tue Mar 14 12:05:10 2006 DEBUG at Cache.cpp:487 - 34 Pop > 1 0 > > Tue Mar 14 12:05:10 2006 DEBUG at Cache.cpp:487 - 35 > Goto 0 38 > > Tue Mar 14 12:05:10 2006 DEBUG at Cache.cpp:487 - 36 > MakeRecord 1 > > 0 i > > Tue Mar 14 12:05:10 2006 DEBUG at Cache.cpp:487 - 37 > IdxInsert 4 > > 0 > > Tue Mar 14 12:05:10 2006 DEBUG at Cache.cpp:487 - 38 > Next 2 32 > > Tue Mar 14 12:05:10 2006 DEBUG at Cache.cpp:487 - 39 > Close 2 0 > > Tue Mar 14 12:05:10 2006 DEBUG at Cache.cpp:487 - 40 > Integer 1 0 > > Tue Mar 14 12:05:10 2006 DEBUG at Cache.cpp:487 - 41 > Column 1 0 > > Tue Mar 14 12:05:10 2006 DEBUG at Cache.cpp:487 - 42 > NotNull -1 46 > > Tue Mar 14 12:05:10 2006 DEBUG at Cache.cpp:487 - 43 Pop > 2 0 > > Tue Mar 14 12:05:10 2006 DEBUG at Cache.cpp:487 - 44 > Null 0 0 > > Tue Mar 14 12:05:10 2006 DEBUG at Cache.cpp:487 - 45 > Goto 0 49 > > Tue Mar 14 12:05:10 2006 DEBUG at Cache.cpp:487 - 46 > MakeRecord 1 > > 0 i > > Tue Mar 14 12:05:10 2006 DEBUG at Cache.cpp:487 - 47 > Found 4 49 > > Tue Mar 14 12:05:10 2006 DEBUG at Cache.cpp:487 - 48 > AddImm -1 0 > > Tue Mar 14 12:05:10 2006 DEBUG at Cache.cpp:487 - 49 If > 1 54 > > Tue Mar 14 12:05:10 2006 DEBUG at Cache.cpp:487 - 50 > Column 0 1 > > Tue Mar 14 12:05:10 2006 DEBUG at Cache.cpp:487 - 51 > Column 1 0 > > Tue Mar 14 12:05:10 2006 DEBUG at Cache.cpp:487 - 52 > Column 1 1 > > Tue Mar 14 12:05:10 2006 DEBUG at Cache.cpp:487 - 53 > Callback 3 > > 0 > > Tue Mar 14 12:05:10 2006 DEBUG at Cache.cpp:487 - 54 > Next 3 17 > > Tue Mar 14 12:05:10 2006 DEBUG at Cache.cpp:487 - 55 > Next 0 10 > > Tue Mar 14 12:05:10 2006 DEBUG at Cache.cpp:487 - 56 > Close 0 0 > > Tue Mar 14 12:05:10 2006 DEBUG at Cache.cpp:487 - 57 > Close 1 0 > > Tue Mar 14 12:05:10 2006 DEBUG at Cache.cpp:487 - 58 > Close 3 0 > > Tue Mar 14 12:05:10 2006 DEBUG at Cache.cpp:487 - 59 > Halt 0 0 > > Tue Mar 14 12:05:10 2006 DEBUG at Cache.cpp:487 - 60 > Transaction 0 > > 0 > > Tue Mar 14 12:05:10 2006 DEBUG at Cache.cpp:487 - 61 > VerifyCookie 0 > > 20 > > Tue Mar 14 12:05:10 2006 DEBUG at Cache.cpp:487 - 62 > Goto 0 1 > > Tue Mar 14 12:05:10 2006 DEBUG at Cache.cpp:487 - 63 > Noop 0 0 > > > > Many thanks, > > > > David Carter-Hitchin. > > -- > > Royal Bank of Scotland > > Interest Rate Derivatives IT > > 135 Bishopsgate > > LONDON EC2M 3TP > > > > Tel: +44 (0) 207 085 1088 > > > > > > > ************************************************************** > ********************* > > The Royal Bank of Scotland plc. Registered in Scotland No > 90312. Registered Office: 36 St Andrew Square, Edinburgh EH2 2YB. > > Authorized and regulated by the Financial Services Authority > > > > This e-mail message is confidential and for use by the > > addressee only. If the message is received by anyone other > > than the addressee, please return the message to the sender > > by replying to it and then delete the message from your > > computer. Internet e-mails are not necessarily secure. The > > Royal Bank of Scotland plc does not accept responsibility for > > changes made to this message after it was sent. > > > > Whilst all reasonable care has been taken to avoid the > > transmission of viruses, it is the responsibility of the > recipient to > > ensure that the onward transmission, opening or use of this > > message and any attachments will not adversely affect its > > systems or data. No responsibility is accepted by The Royal > > Bank of Scotland plc in this regard and the recipient should carry > > out such virus and other checks as it considers appropriate. > > Visit our websites at: > > http://www.rbos.com > > http://www.rbsmarkets.com > > > ************************************************************** > ****************** > > > > >