I've traced this issue down to the simplest test case:

CREATE TABLE IF NOT EXISTS foo
(
 id  INTEGER,
 baz INTEGER,
 PRIMARY KEY(id)
);

CREATE INDEX IF NOT EXISTS baz_foo_idx ON foo(baz, id);

CREATE TABLE IF NOT EXISTS bar
(
 foo INTEGER,
 PRIMARY KEY(foo),
 FOREIGN KEY(foo) REFERENCES foo(id) ON DELETE CASCADE
);

WITH RECURSIVE
 cnt(x, y) AS (VALUES(1, 1) UNION ALL SELECT x + 1, x + 1 FROM cnt WHERE x < 
200000)
 INSERT INTO foo(id, baz) SELECT x, y FROM cnt;

WITH RECURSIVE
 cnt(x) AS (VALUES(1) UNION ALL SELECT x + 3 FROM cnt WHERE x < 50000)
 INSERT INTO bar SELECT x FROM cnt;

SELECT id FROM foo WHERE baz = 99999 AND id IN (SELECT foo FROM bar) LIMIT 0, 
10;


This query takes too much time:   

 SELECT id FROM foo WHERE baz = 10000 AND id IN (SELECT foo FROM bar) LIMIT 1; 


It seems like execution time is a function of baz: 

sqlite> .timer on 
sqlite> SELECT id FROM foo WHERE baz = 10000 AND id IN (SELECT foo FROM bar) 
LIMIT 1;
id        
----------
10000     
Run Time: real 14.839 user 14.836000 sys 0.000000
sqlite> SELECT id FROM foo WHERE baz = 1000 AND id IN (SELECT foo FROM bar) 
LIMIT 1;
id        
----------
1000      
Run Time: real 1.577 user 1.576000 sys 0.000000
sqlite> SELECT id FROM foo WHERE baz = 100 AND id IN (SELECT foo FROM bar) 
LIMIT 1;
id        
----------
100       
Run Time: real 0.232 user 0.232000 sys 0.000000
sqlite> SELECT id FROM foo WHERE baz = 10 AND id IN (SELECT foo FROM bar) LIMIT 
1;
id        
----------
10        
Run Time: real 0.036 user 0.036000 sys 0.000000
sqlite> SELECT id FROM foo WHERE baz = 1 AND id IN (SELECT foo FROM bar) LIMIT 
1;
id        
----------
1         
Run Time: real 0.001 user 0.000000 sys 0.000000
 
 
_______________________________________________
sqlite-users mailing list
sqlite-users@mailinglists.sqlite.org
http://mailinglists.sqlite.org/cgi-bin/mailman/listinfo/sqlite-users

Reply via email to