我需要从另一个数据库更新一个表。我附上它并删除并插入。插入速度很快,但删除耗费了很长时间。对于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);
答案 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)
似乎在交易删除操作中有问题。尝试删除它。
而不是删除您可以创建新的一个表并从第一个表复制您需要的表,插入新数据,删除第一个表并重命名新表。这样你就需要在事务中包装表重命名代码。