Hi,

I have a question regarding the performance of DELETE FROM (or maybe better: correlated subqueries).

I have a table "main" and a table "staging". In "staging" I have a subset of "main". I want to delete all rows from "main" which are also in "staging".

  CREATE TABLE main ( ATT1 INT, ATT2 INT, PRIMARY KEY (ATT1,ATT2) );
  CREATE TABLE staging ( ATT1 INT, ATT2 INT );

Then I execute

  DELETE FROM main WHERE EXISTS (SELECT 1 FROM staging WHERE main.att1 = staging.att1 AND main.att2 = staging.att2)

which takes a very long time. As far as I understand the query plan SQLite scans the full staging table for each row in "main":

  sqlite> EXPLAIN QUERY PLAN DELETE FROM main WHERE EXISTS (SELECT 1 FROM staging WHERE main.att1 = staging.att1 AND main.att2 = staging.att2)
     ...> ;
  QUERY PLAN
  |--SCAN TABLE main
  `--CORRELATED SCALAR SUBQUERY
     `--SCAN TABLE staging

How do I speed this up? The idea is that the database should scan "staging" and lookup "main" (because an appropriate primary index exists).

But I'm open to any alternative approach. I just have the situation that I have a very large "main" table and a "staging" table which contains also a large number of tuples which should be deleted from "main".

Any ideas?

Thanks,

Jürgen

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

Reply via email to