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
SQLite im Web – WAL-Modus und die PRAGMAs, die „database is locked" beenden
SQLite ist für kleine und mittlere Websites hervorragend – wenn man es richtig einstellt. Vier Zeilen beim Verbindungsaufbau entscheiden darüber, ob parallele Zugriffe funktionieren oder in einer Sperrmeldung enden.
Laufende Summe in SQL – SUM() OVER statt Schleife in der Anwendung
Kontostand nach jeder Buchung, kumulierter Umsatz im Jahr, Restbestand nach jeder Entnahme: Alles dieselbe Frage. Mit einer Fensterfunktion beantwortet die Datenbank sie in einer Abfrage – inklusive gleitendem Durchschnitt.
Generierte Spalten in SQLite – abgeleitete Werte, die nie veralten
Bruttopreis, Suchspalte in Kleinschreibung, das Jahr aus einem Zeitstempel: Solche Werte doppelt zu pflegen ist eine Einladung an die Inkonsistenz. SQLite kann sie selbst berechnen – und sogar indizieren.