Hi, I just tested Sqlite 3.8.5 on Subversion's schema and found that one of our queries started using a temporary B-Tree while executing, which it didn't use in any older Sqlite version. I wouldn't expect a usage of a temporary table as the data is already properly ordered when it uses the primary key index.
The query in its readable form is: [[ INSERT INTO delete_list(local_relpath) SELECT ?2 UNION ALL SELECT local_relpath FROM nodes AS n WHERE wc_id = ?1 AND IS_STRICT_DESCENDANT_OF(local_relpath, ?2) AND op_depth >= ?3 AND op_depth = (SELECT MAX(s.op_depth) FROM nodes AS s WHERE s.wc_id = ?1 AND s.local_relpath = n.local_relpath) AND presence NOT IN (MAP_BASE_DELETED, MAP_NOT_PRESENT, MAP_EXCLUDED, MAP_SERVER_EXCLUDED) AND file_external IS NULL ORDER by local_relpath ]] The actual query passed to sqlite is: [[ INSERT INTO delete_list(local_relpath) SELECT ?2 UNION ALL SELECT local_relpath FROM nodes AS n WHERE wc_id = ?1 AND (((local_relpath) > (CASE (?2) WHEN '' THEN '' ELSE (?2) || '/' END)) AND ((local_relpath) < CASE (?2) WHEN '' THEN X'FFFF' ELSE (?2) || '0' END)) AND op_depth >= ?3 AND op_depth = (SELECT MAX(s.op_depth) FROM nodes AS s WHERE s.wc_id = ?1 AND s.local_relpath = n.local_relpath) AND presence NOT IN ('base-deleted', 'not-present', 'excluded', 'server-excluded') AND file_external IS NULL ORDER by local_relpath ]] The query plan in 3.8.5-201405271818 is: [[ USE TEMP B-TREE FOR ORDER BY SEARCH TABLE nodes AS n USING INDEX sqlite_autoindex_NODES_1 (wc_id=? AND local_relpath>? AND local_relpath<?) EXECUTE CORRELATED SCALAR SUBQUERY 3 SEARCH TABLE nodes AS s USING COVERING INDEX sqlite_autoindex_NODES_1 (wc_id=? AND local_relpath=?) EXECUTE LIST SUBQUERY 4 COMPOUND SUBQUERIES 1 AND 2 (UNION ALL) ]] In 3.7.17 and 3.8.4 it was: [[ 2|0|0|SEARCH TABLE nodes AS n USING INDEX sqlite_autoindex_NODES_1 (wc_id=? AND local_relpath>? AND local_relpath<?) 2|0|0|EXECUTE CORRELATED SCALAR SUBQUERY 3 3|0|0|SEARCH TABLE nodes AS s USING COVERING INDEX sqlite_autoindex_NODES_1 (wc_ id=? AND local_relpath=?) 2|0|0|EXECUTE LIST SUBQUERY 4 0|0|0|COMPOUND SUBQUERIES 1 AND 2 (UNION ALL) ]] Relevant schema: [[ CREATE TEMPORARY TABLE delete_list ( local_relpath TEXT PRIMARY KEY NOT NULL UNIQUE ) CREATE TABLE NODES ( wc_id INTEGER NOT NULL REFERENCES WCROOT (id), local_relpath TEXT NOT NULL, op_depth INTEGER NOT NULL, parent_relpath TEXT, repos_id INTEGER REFERENCES REPOSITORY (id), repos_path TEXT, revision INTEGER, presence TEXT NOT NULL, moved_here INTEGER, moved_to TEXT, kind TEXT NOT NULL, properties BLOB, depth TEXT, checksum TEXT REFERENCES PRISTINE (checksum), symlink_target TEXT, changed_revision INTEGER, changed_date INTEGER, changed_author TEXT, translated_size INTEGER, last_mod_time INTEGER, dav_cache BLOB, file_external INTEGER, inherited_props BLOB, PRIMARY KEY (wc_id, local_relpath, op_depth) ); CREATE UNIQUE INDEX I_NODES_PARENT ON NODES (wc_id, parent_relpath, local_relpath, op_depth); CREATE UNIQUE INDEX I_NODES_MOVED ON NODES (wc_id, moved_to, op_depth); INSERT INTO "sqlite_stat1" VALUES('NODES','sqlite_autoindex_NODES_1','8000 8000 2 1'); INSERT INTO "sqlite_stat1" VALUES('NODES','I_NODES_PARENT','8000 8000 10 2 1'); INSERT INTO "sqlite_stat1" VALUES('NODES','I_NODES_MOVED','8000 8000 1 1'); ]] Bert _______________________________________________ sqlite-users mailing list sqlite-users@sqlite.org http://sqlite.org:8080/cgi-bin/mailman/listinfo/sqlite-users