Update mit Daten aus einer anderen Tabelle

Verstehe ich richtig, dass mein Code dann MIT "Transaction" von SQLite wesentlich schneller ausgeführt werden sollte?:

Wenn Du viele einzelne Statements zu einer Transaktion bündelst, ist deutlich weniger Aufwand da für die DB. Bei einer einzelnen Aktion macht es eher wenig oder keinen Unterschiedm, aber wenn Du 100.000 Inserts machst ohne expliziet diese in einer einzelnen TX zu machen dann ist jedes Insert für sich eine TX, wenn aber vorher/danach eine TX expliziet begonnen/beendet wird geht das um einiges schneller. Ist bei PG so und sehr sicher auch in vielen/anderen Systemen.
 
Werbung:
Habe "TRANSACTION" einmal mit einer verkleinerten Version meiner Datenbank mit 1 Million Datensätzen ausprobiert und konnte keinen Unterschied feststellen:
(Wenn der SQL Code richtig ist / bzw. die Semikolon korrekt gesetzt sind?)

BEGIN;
UPDATE Table
SET
Name = (SELECT Table_Neu.Name_Neu FROM Table_Neu WHERE ID = Table.ID)
WHERE EXISTS (SELECT 1 FROM Table_Neu WHERE ID = Table.ID);
COMMIT;

Ohne TRANSACTION: 125019ms / 2052 rows affected
Mit TRANSACTION: 125774ms / 2052 rows affected

Dass das SQL Script bei vollständiger Datenbank 4 Stunden benötigt, ist aber im Grunde nicht weiter tragisch. Weil das SQL Script nur einmal bei Erstellung der Datenbank benötigt wird.
 
Inwiefern unterscheidet sich deine "Table_Neu" von deiner "Table"?
Sind die Datensätze bis auf die Spalte "Name" identisch?
Dann könntest du einfach die alte Tabelle droppen und die neue Umbenennen :)
 
"Table_Neu" ist nur eine kleine Teilmenge (ca. 3%) von "Table".
"Table" enthält alle Name in englischer Schreibweise, "Table_Neu" dagegen nur die deutschen Namen, die sich von der englischen Schreibweise unterscheiden. Mit dem "Update" Befehl wird "Table" auf die deutsche Sprache umgestellt. "Table_Neu" wird danach gelöscht.
 
Würde sich in so einem Fall nicht eine View anbieten?
Code:
sqlite> SELECT * FROM Main;
1|foo1
2|foo2
3|foo3

sqlite> SELECT * FROM de;
2|bar2
3|bar3

sqlite> CREATE VIEW Main_de AS
   ...> SELECT Main.id as id,  COALESCE(de.Name, Main.Name) AS Name
   ...> FROM  Main
   ...> LEFT JOIN de
   ...> ON Main.id = de.id;

sqlite> SELECT * FROM Main_de;
1|foo1
2|bar2
3|bar3
 
Werbung:
Zurück
Oben