2016-06-01 7 views
0

Ich muss eine Tabelle aus einer anderen Datenbank aktualisieren. Ich füge es an und lösche und füge es ein. Einfügen geht schnell, aber Löschen dauerte sehr viel Zeit. Für 200k Aufzeichnungen dauerte es ungefähr 1 Minute. Wie geht es schneller?Slow DELETE in Sqlite

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 tun die gleiche Operation für 4 Sekunden

Update:

hier ist die Struktur meiner 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); 
+1

können Sie die 'drop-Tabelle' wie folgt verwenden:' db.execSQL ("DROP TABLE IF EXISTS" + CategoryProduct_MM); ' – NSimon

+1

Haben Sie Index auf PrdID? – Selvin

+0

@NicolasSimon Wenn Sie die Tabelle löschen, werden Sie alle Zeilen löschen, während es scheint, dass der Benutzer nur eine Auswahl von Zeilen löschen möchte (genauer gesagt diejenigen, deren 'PrdId' in einer anderen Tabelle vorhanden ist) – user2340612

Antwort

0

Es wurde mit dem Löschen von Indizes vor dem Löschen und dem Neuerstellen nach dem Einfügen behoben.

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)"); 

Für 200K Aufzeichnungen dauerte es 7 sek.

0

Scheint Problem in transactioning Löschvorgang. Versuche es zu löschen.

Anstatt zu löschen, können Sie eine neue Tabelle erstellen und dort kopieren, was Sie von der ersten Tabelle benötigen, neue Daten einfügen, erste Tabelle löschen und neue Tabelle umbenennen. Auf diese Weise müssen Sie nur den Umbenennungscode für Transaktionen in Tabellen umwandeln.