在Sqlite中缓慢删除

时间:2016-06-01 09:39:35

标签: android sqlite

我需要从另一个数据库更新一个表。我附上它并删除并插入。插入速度很快,但删除耗费了很长时间。对于200k的记录,花了大约1分钟。怎么做得更快?

db.execSQL("attach database '" + db_path + "' as db2");
db.beginTransaction();
try {
    db.execSQL("DELETE FROM CategoryProduct_MM WHERE PrdID IN (SELECT PrdID FROM db2.CategoryProduct_MM)");
    db.execSQL("INSERT INTO CategoryProduct_MM SELECT * FROM db2.CategoryProduct_MM");
    db.setTransactionSuccessful();
} finally {
    db.endTransaction();
}

sqlitebrowser执行相同的操作4秒

更新

这是我的db

的结构
CREATE TABLE CategoryProduct_MM(CategoryID INTEGER, PrdID INTEGER)
CREATE UNIQUE INDEX CategoryProduct_MM_CatID_PrdID_idx ON CategoryProduct_MM(CategoryID,PrdID);
CREATE INDEX CategoryProduct_MM_CatID_idx ON CategoryProduct_MM(CategoryID);
CREATE INDEX CategoryProduct_MM_PrdID_idx ON CategoryProduct_MM(PrdID);

2 个答案:

答案 0 :(得分:1)

在删除之前通过删除索引解决它并在插入后重新创建它们。

    db.execSQL("DROP INDEX IF EXISTS CategoryProduct_MM_CatID_PrdID_idx");
    db.execSQL("DROP INDEX IF EXISTS CategoryProduct_MM_CatID_idx");
    db.execSQL("DROP INDEX IF EXISTS CategoryProduct_MM_PrdID_idx");
    db.execSQL("DELETE FROM CategoryProduct_MM WHERE PrdID IN (SELECT PrdID FROM superup.CategoryProduct_MM)");
    db.execSQL("INSERT OR REPLACE INTO CategoryProduct_MM SELECT * FROM superup.CategoryProduct_MM");
    db.execSQL("CREATE UNIQUE INDEX CategoryProduct_MM_CatID_PrdID_idx ON CategoryProduct_MM(CategoryID,PrdID)");
    db.execSQL("CREATE INDEX CategoryProduct_MM_CatID_idx ON CategoryProduct_MM(CategoryID)");
    db.execSQL("CREATE INDEX CategoryProduct_MM_PrdID_idx ON CategoryProduct_MM(PrdID)");

对于200K记录,花了7秒。

答案 1 :(得分:0)

似乎在交易删除操作中有问题。尝试删除它。

而不是删除您可以创建新的一个表并从第一个表复制您需要的表,插入新数据,删除第一个表并重命名新表。这样你就需要在事务中包装表重命名代码。