1000 Inserts in SQLite – mit einer Transaktion plötzlich 100× schneller
Wenn du viele Zeilen einzeln in SQLite schreibst, ist jeder INSERT eine eigene Transaktion und landet einzeln auf der Platte. Packst du alles in EIN BEGIN/COMMIT, wird der Import dramatisch schneller – und ist obendrein „alles oder nichts".
Ich nutze SQLite in fast jedem Projekt. Der häufigste Anfängerfehler beim Import vieler Zeilen: jeden INSERT einzeln abschicken. SQLite macht dann aus jedem Insert eine eigene Transaktion und schreibt sie einzeln sicher auf die Platte (fsync). Das ist langsam – bei tausenden Zeilen dauert es gefühlt ewig.
Langsam: jeder Insert einzeln
-- Ohne Transaktion: 1000× auf die Platte schreiben → zäh
INSERT INTO log (msg) VALUES ('Zeile 1');
INSERT INTO log (msg) VALUES ('Zeile 2');
-- … 998 weitere …Schnell: alles in eine Transaktion
BEGIN;
INSERT INTO log (msg) VALUES ('Zeile 1');
INSERT INTO log (msg) VALUES ('Zeile 2');
-- … 998 weitere …
COMMIT;Jetzt wird einmal am Ende sicher geschrieben statt tausendmal. In der Praxis sind das schnell zwei Größenordnungen Unterschied.
Der zweite Gewinn ist Atomarität: Läuft irgendwo mittendrin ein Fehler, brichst du mit ROLLBACK; ab – dann ist keine der Zeilen drin. Du hast nie einen halben, kaputten Import.
In PHP (PDO) sieht das so aus
$db->beginTransaction();
try {
$stmt = $db->prepare('INSERT INTO log (msg) VALUES (?)');
foreach ($zeilen as $z) {
$stmt->execute([$z]); // dasselbe Prepared Statement wiederverwenden
}
$db->commit();
} catch (\Throwable $e) {
$db->rollBack(); // alles zurück – kein halber Import
throw $e;
}Faustregel: Sobald du mehr als eine Handvoll Schreibvorgänge zusammen hast, gehören sie in eine Transaktion. Prepared Statement einmal vorbereiten, in der Schleife nur noch execute – das ist der schnellste und sauberste Weg.
Solche Datenbank-Kniffe stecken in jedem Projekt, das ich baue. Wenn du eine Anwendung mit sauberem, schnellem SQLite-Unterbau brauchst, meld dich gern über bymw.de.
Quellen
Du brauchst mehr als ein Snippet?
Ich entwickle Android-Apps in Kotlin und moderne Websites für Selbstständige und kleine Unternehmen — von der ersten Idee bis zum Release.
Projekt anfragen →Verwandte Snippets
Volltextsuche in SQLite mit FTS5 – schneller und besser als LIKE '%wort%
LIKE '%suchwort%' kann keinen Index nutzen und liest bei jeder Suche die ganze Tabelle. FTS5 ist in SQLite eingebaut, findet auch Wortanfänge und sortiert die Treffer nach Relevanz – ohne Elasticsearch daneben.
STRICT-Tabellen in SQLite: wenn „drei“ nicht mehr in eine INTEGER-Spalte passt
SQLite nimmt in einer INTEGER-Spalte klaglos den Text „drei“ entgegen und speichert ihn als Text. Das ist kein Fehler, sondern Absicht – und trotzdem der Grund für Auswertungen, die still falsche Zahlen liefern. Ein Schlüsselwort schaltet es ab.
Wie viel mehr als gestern? Differenz zur Vorzeile mit LAG() in SQL
„Wie viele Besucher heute im Vergleich zu gestern?" – der Reflex ist ein Self-Join auf die Vorzeile. Mit der Fensterfunktion LAG() bekommst du den Wert der vorherigen Zeile direkt daneben, ohne die Tabelle ein zweites Mal anzufassen.