Hi, I like to use a recursive query for analyzing a table with a tree like data structure. In my table t1, each row has a column with the parent rowed/o value. Functional, the queries working fine, but because of the expected size of t1, i like to help the query planer with the parent-child relation by creating this index. "CREATE INDEX IF NOT EXISTS i_t1 ON t1 (p_o)"
root/o=1 child/o=2;p_o=1 child/o=3;p_o=1 child/o=4;p_o=1 child/o=5;p_o=4 child/o=6;p_o=4 child/o=7;p_o=4 In practice: Q4 is much faster then Q6 because of using the "AUTOMATIC COVERING INDEX (id=?)". My question: Why is the index i_t1 not used in Q6? Maik Example: Q1:) BEGIN TRANSACTION; CREATE TABLE "t1" ( `o` INTEGER, `p_o` TEXT NOT NULL, `a` TEXT NOT NULL, `id` TEXT NOT NULL, `tag` TEXT, PRIMARY KEY(o) ); INSERT INTO `t1` VALUES(103903,0,18,59207,2); INSERT INTO `t1` VALUES(103904,103903,18,59207,516); INSERT INTO `t1` VALUES(103905,103903,18,59207,5); INSERT INTO `t1` VALUES(103906,103903,18,59207,545); INSERT INTO `t1` VALUES(103907,103906,18,59207,8576); INSERT INTO `t1` VALUES(103908,103906,18,59207,8484); INSERT INTO `t1` VALUES(103909,103908,18,59207,9344); INSERT INTO `t1` VALUES(103910,103908,18,59207,9345); INSERT INTO `t1` VALUES(103911,103908,18,59207,9253); INSERT INTO `t1` VALUES(103912,103911,18,59207,9600); INSERT INTO `t1` VALUES(103913,103906,18,59207,8476); INSERT INTO `t1` VALUES(103914,103913,18,59207,7297); INSERT INTO `t1` VALUES(103915,103913,18,59207,7185); INSERT INTO `t1` VALUES(103916,103915,18,59207,4353); INSERT INTO `t1` VALUES(103917,103913,18,59207,7186); INSERT INTO `t1` VALUES(103918,103917,18,59207,4609); INSERT INTO `t1` VALUES(103919,103913,18,59207,7193); INSERT INTO `t1` VALUES(103920,103919,18,59207,6444); INSERT INTO `t1` VALUES(103921,103920,18,59207,11392); INSERT INTO `t1` VALUES(103922,103920,18,59207,11393); INSERT INTO `t1` VALUES(103923,103906,18,59207,8476); COMMIT; Q2:) CREATE INDEX IF NOT EXISTS i_t1 ON t1 (p_o) sqlite> select * from t1; "103903" "0" "18" "59207" "2" "103904" "103903" "18" "59207" "516" "103905" "103903" "18" "59207" "5" "103906" "103903" "18" "59207" "545" "103907" "103906" "18" "59207" "8576" "103908" "103906" "18" "59207" "8484" "103909" "103908" "18" "59207" "9344" "103910" "103908" "18" "59207" "9345" "103911" "103908" "18" "59207" "9253" "103912" "103911" "18" "59207" "9600" "103913" "103906" "18" "59207" "8476" "103914" "103913" "18" "59207" "7297" "103915" "103913" "18" "59207" "7185" "103916" "103915" "18" "59207" "4353" "103917" "103913" "18" "59207" "7186" "103918" "103917" "18" "59207" "4609" "103919" "103913" "18" "59207" "7193" "103920" "103919" "18" "59207" "6444" "103921" "103920" "18" "59207" "11392" "103922" "103920" "18" "59207" "11393" "103923" "103906" "18" "59207" "8476" Q3:) EXPLAIN QUERY PLAN WITH RECURSIVE tn(o,level,roottag,id,path) AS ( SELECT o,0,tag,id,printf('%04p',tag&0xff) AS path FROM t1 WHERE unlikely(p_o=0) AND (tag=0x02 OR tag=0x03) UNION SELECT t1.o,tn.level+1,tn.roottag,tn.id,printf('%s.%04p',tn.path,t1.tag&0xff) FROM t1,tn WHERE tn.id=t1.id AND tn.o=t1.p_o ) SELECT * FROM tn; =>Remark: The relation "tn.id=t1.id" is optional! "2" "0" "0" "SEARCH TABLE t1 USING INDEX i_t1 (p_o=?)" "3" "0" "1" "SCAN TABLE tn" "3" "1" "0" "SEARCH TABLE t1 USING AUTOMATIC COVERING INDEX (id=?)" "1" "0" "0" "COMPOUND SUBQUERIES 0 AND 0 USING TEMP B-TREE (UNION)" "0" "0" "0" "SCAN SUBQUERY 1" Q4:) WITH RECURSIVE tn(o,level,roottag,id,path) AS ( SELECT o,0,tag,id,printf('%04p',tag&0xff) AS path FROM t1 WHERE unlikely(p_o=0) AND (tag=0x02 OR tag=0x03) UNION SELECT t1.o,tn.level+1,tn.roottag,tn.id,printf('%s.%04p',tn.path,t1.tag&0xff) FROM t1,tn WHERE tn.id=t1.id AND tn.o=t1.p_o ) SELECT * FROM tn; "103903" "0" "2" "59207" "0002" "103905" "1" "2" "59207" "0002.0005" "103904" "1" "2" "59207" "0002.0004" "103906" "1" "2" "59207" "0002.0021" "103913" "2" "2" "59207" "0002.0021.001C" "103923" "2" "2" "59207" "0002.0021.001C" "103908" "2" "2" "59207" "0002.0021.0024" "103907" "2" "2" "59207" "0002.0021.0080" "103915" "3" "2" "59207" "0002.0021.001C.0011" "103917" "3" "2" "59207" "0002.0021.001C.0012" "103919" "3" "2" "59207" "0002.0021.001C.0019" "103914" "3" "2" "59207" "0002.0021.001C.0081" "103911" "3" "2" "59207" "0002.0021.0024.0025" "103909" "3" "2" "59207" "0002.0021.0024.0080" "103910" "3" "2" "59207" "0002.0021.0024.0081" "103916" "4" "2" "59207" "0002.0021.001C.0011.0001" "103918" "4" "2" "59207" "0002.0021.001C.0012.0001" "103920" "4" "2" "59207" "0002.0021.001C.0019.002C" "103912" "4" "2" "59207" "0002.0021.0024.0025.0080" "103921" "5" "2" "59207" "0002.0021.001C.0019.002C.0080" "103922" "5" "2" "59207" "0002.0021.001C.0019.002C.0081" Q5:) EXPLAIN QUERY PLAN WITH RECURSIVE tn(o,level,roottag,id,path) AS ( SELECT o,0,tag,id,printf('%04p',tag&0xff) AS path FROM t1 WHERE unlikely(p_o=0) AND (tag=0x02 OR tag=0x03) UNION SELECT t1.o,tn.level+1,tn.roottag,tn.id,printf('%s.%04p',tn.path,t1.tag&0xff) FROM t1,tn WHERE tn.o=t1.p_o ) SELECT * FROM tn; "2" "0" "0" "SEARCH TABLE t1 USING INDEX i_t1 (p_o=?)" "3" "0" "0" "SCAN TABLE t1" "3" "1" "1" "SCAN TABLE tn" "1" "0" "0" "COMPOUND SUBQUERIES 0 AND 0 USING TEMP B-TREE (UNION)" "0" "0" "0" "SCAN SUBQUERY 1" Q6:) WITH RECURSIVE tn(o,level,roottag,id,path) AS ( SELECT o,0,tag,id,printf('%04p',tag&0xff) AS path FROM t1 WHERE unlikely(p_o=0) AND (tag=0x02 OR tag=0x03) UNION SELECT t1.o,tn.level+1,tn.roottag,tn.id,printf('%s.%04p',tn.path,t1.tag&0xff) FROM t1,tn WHERE tn.o=t1.p_o ) SELECT * FROM tn; "103903" "0" "2" "59207" "0002" "103904" "1" "2" "59207" "0002.0004" "103905" "1" "2" "59207" "0002.0005" "103906" "1" "2" "59207" "0002.0021" "103907" "2" "2" "59207" "0002.0021.0080" "103908" "2" "2" "59207" "0002.0021.0024" "103913" "2" "2" "59207" "0002.0021.001C" "103923" "2" "2" "59207" "0002.0021.001C" "103909" "3" "2" "59207" "0002.0021.0024.0080" "103910" "3" "2" "59207" "0002.0021.0024.0081" "103911" "3" "2" "59207" "0002.0021.0024.0025" "103914" "3" "2" "59207" "0002.0021.001C.0081" "103915" "3" "2" "59207" "0002.0021.001C.0011" "103917" "3" "2" "59207" "0002.0021.001C.0012" "103919" "3" "2" "59207" "0002.0021.001C.0019" "103912" "4" "2" "59207" "0002.0021.0024.0025.0080" "103916" "4" "2" "59207" "0002.0021.001C.0011.0001" "103918" "4" "2" "59207" "0002.0021.001C.0012.0001" "103920" "4" "2" "59207" "0002.0021.001C.0019.002C" "103921" "5" "2" "59207" "0002.0021.001C.0019.002C.0080" "103922" "5" "2" "59207" "0002.0021.001C.0019.002C.0081" Q7:) ANALYZE Q8:) EXPLAIN QUERY PLAN WITH RECURSIVE tn(o,level,roottag,id,path) AS ( SELECT o,0,tag,id,printf('%04p',tag&0xff) AS path FROM t1 WHERE unlikely(p_o=0) AND (tag=0x02 OR tag=0x03) UNION SELECT t1.o,tn.level+1,tn.roottag,tn.id,printf('%s.%04p',tn.path,t1.tag&0xff) FROM t1,tn WHERE tn.o=t1.p_o ) SELECT * FROM tn; "2" "0" "0" "SEARCH TABLE t1 USING INDEX i_t1 (p_o=?)" "3" "0" "0" "SCAN TABLE t1" "3" "1" "1" "SCAN TABLE tn" "1" "0" "0" "COMPOUND SUBQUERIES 0 AND 0 USING TEMP B-TREE (UNION)" "0" "0" "0" "SCAN SUBQUERY 1" _______________________________________________ sqlite-users mailing list sqlite-users@sqlite.org http://sqlite.org:8080/cgi-bin/mailman/listinfo/sqlite-users