2016-06-01 96 views
0

別のデータベースから1つのテーブルを更新する必要があります。私はそれを添付し、削除して挿入します。挿入は速くなりますが、削除には非常に長い時間がかかりました。 200kレコードでは約1分かかりました。どのように速くそれを行うには?Sqliteで遅いDELETE

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秒

ために同じ操作を行う

アップデート:ここ

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); 
+1

'drop table'は次のように使用できます:' db.execSQL( "DROP TABLE IF EXISTS" + CategoryProduct_MM); ' – NSimon

+1

あなたはPrdIDにインデックスを持っていますか? – Selvin

+0

@NicolasSimonテーブルを削除すると、すべての行が削除されますが、選択した行だけを削除したい場合(具体的には、別のテーブルの中に 'PrdId'があるもの) – user2340612

答えて

0

削除する前にインデックスを削除し、挿入後に再作成して解決しました。

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秒かかりました。

0

がtransactioning削除操作で問題のように思える私のデシベルの構造です。それを削除してみてください。

削除する代わりに、新しいテーブルを作成し、最初のテーブルから必要なものをコピーし、新しいデータを挿入し、最初のテーブルを削除して新しいテーブルの名前を変更することができます。このように、テーブルの名前を変更するだけのトランザクションでラップする必要があります。

関連する問題