SQL-Statement Update mit innerjoin

OnDemand

Top Contributor
Guten Morgen zusammen,
ich möchte meine Updates beschleunigen. Ist es möglich ein Innerjoin in einem Update stmt. Zu packen? Kann mir da jemand helfen, bin mit SQL nicht so bewandert was außerhalb der Standard CRUD liegt. Tabellen sind zb.

Auto
autoID
autoName

Autoreise
autoID
autoPreis

Update autopreise set autopreis=100.00 where autoID=123

Aber sie AutoId muss ich vorher erst aus der DB lesen, was die Sache etwas verlangsamt. Daher mein Gedanke während des Updates gleich die ID zu holen und dadurch etwas zeit zu sparen.

Habt ihr eine Idee? Freue mich auf Hilfe!
 
Ich verstehe das Problem im Augenblick nicht. Du willst nur den Preis ändern und hast nur den Namen? Dann kannst Du die Id per Select holen Update .... Where autoID = (select autoID from ......)
 
UPDATE Autopreise
JOIN Auto ON (Auto.autoID = Autopreise.autoID)
SET Autopreise.autopreis=100.00
WHERE Auto.autoName=123

Gruß

Claus
 
Thallius, danke!!!!!!!!!! Teste ich sofort wenn ich zu hause bin. Beschleunigt das die Updates im Gegensatz zu einem extra stmt um die Id zu holen?
 
Geht das auch mit INSERT? Hab getestet aber falsche syntax :'(

zb

stmt.executeUpdate("INSERT INTO auto(autoId, name) VALUES(1,'Mercedes')");
stmt.executeUpdate("INSERT INTO autoBeschreibung(autoId, beschreibung) VALUES(hierDieIDAusAuto,'schönes Auto')");

Bisher sende ich sein seperaten SELECT vorab und speicher den wert in einer Variable. Aber das geht garantiert auch zeitschonender in einem Query oder?
 
Die entsprechende Dokumentation der DB zeigt meistens auch genau welche Syntax erlaubt, also einfach mal die Dokumentation lesen 😉
Hier ein Beispiel für MySQL http://stackoverflow.com/questions/5391344/insert-with-select , kann man auf dein Anwendungsfall umlegen

Ansonsten kommt mir dein Datenbankschema sehr eigenartig vor. Du hast nur für die Beschreibung und den Preis jeweils eine eigene Tabelle erstellt?
Welchen Sinn soll das haben außer dir das Programmieren zu erschweren weil du 3 Statements statt nur einen absetzen musst?
 
Aber vielleicht solltest du dir auch überlegen ob du nicht einen kleinen Designfehler in deinem Programm hast.

(Bezogen auf deine Beispiele) Wenn ich für ein Auto eine Beschreibung hinzufügen will oder eine neuen Preis setzen will, dann habe ich schon ein Auto Objekt im Speicher und nicht nur den Namen oder die ID des Auto.
Sprich ich habe alle notwendigen Daten im Speicher und muss davor nicht immer eine SELECT absetzen.

Und wenn du wirklich nur anhand von einem String für das passende Auto neue Daten eintragen willst, würde ich es bei 2 verschiedenen SQL Statements belassen (einer um das Auto Objekt zu laden, einer um die neuen Daten einzutragen).
 
Zuletzt bearbeitet:
Die DB ist vorgegeben, da kann ich nichts daran ändern. Warum sollte man keine Subselects machen? Wie könnte man einen INSERT in eine andere Tabelle beschleunigen, wenn ich als Wert die ID aus einer anderen Tabelle brauche
 
Die DB ist vorgegeben, da kann ich nichts daran ändern.
Muss man ja auch nicht (unbedingt).

Warum sollte man keine Subselects machen?
Ganz ohne auskommen muss man nicht, man sollte eben nur gut darauf achten wie man sie einsetzt.
Je nachdem wo ich sie verwende kann es auch schlechter werden mit der Performance
Siehe: https://en.wikipedia.org/wiki/Correlated_subquery

Wie könnte man einen INSERT in eine andere Tabelle beschleunigen, wenn ich als Wert die ID aus einer anderen Tabelle brauche

Wo genau liegt dein Problem: Findest du einfach die DB ist zu langsam? Willst du die DB Zugriffe minimieren? Oder soll die Applikation einfach nur schneller sein?
Je nach Datenbank gibt es mehrere Möglichkeiten sie zu beschleunigen: Indexes sollten überall funktionieren, bei Oracle, IBM und MSSQL kann man noch viele Einstellungen am DB Server anpassen je nachdem kann sich das positiv/negativ auswirken.

Wie oben schon geschrieben vielleicht wäre auch ein anderer Ansatz zielführend: Das entsprechende Auto Objekt bzw. die IDs schon früher in den Speicher zu laden. (vor allem wenn du öfters zum gleichen Auto unterschiedliche UPDATES durchführst)[/QUOTE]
 
Was spricht hier gegen die Unterabfrage? Das ist eine gültige SQL Abfrage und vernünftige Datenbanken sollten da keinerlei Unterschied machen was die Geschwindigkeit angeht. Es gibt nur ganz wenige Konstellationen, bei denen es einen Unterschied macht, wenn halt die innere Abfrage wiederholt aufgerufen werden müsste. Das sind aber wieder ganz spezielle Fälle so dass hier schlicht kein Unterschied zu erwarten ist.

Ich würde mich jetzt sogar nicht wundern, wenn der Execution Plan beim MS SQL Server bei beiden Abfragen gleich wäre, aber das werde ich jetzt nicht noch extra überprüfen.

Konrad
 
Möchte das beschleunigen und die Updates reduzieren.
Derzeit mache ich es so, ich habe eine List mit allen Auto-Objekten (10.000+) aus einer Datei gelesen.
Diese gehe ich in einer for Schleife durch und rufe dann eine methode auf "insert" in dieser Methode muss ich 5 Tabellen mit den Daten aus Autoobjekt füllen, also habe ich 5 Statements (Preperaed STMT verboten, warum ist nicht wichtitg) for dem INSERT seicher in einer Variable die autiID damit ich da schon mal nicht jedes mal abfragen muss
 
Machst du das jedes mal oder ist das eine einmalige (Datenimport) Aktion?
Evtl. kann man die Daten in eine Temporäre Tabelle laden (ohne Indexe) und dann davon in die richtigen Tabellen kopieren / verschieben.
Wie lange dauert diese Aktion bisher? Sekunden? Minuten? Stunden?

EDIT: Ach ja. Hast du Möglichkeiten die Peformance auf SQL Ebene zu debuggen? Kannst du z.B. die Ausführungspläne ausgeben?
 
Hi, öhm Ausführungspläne, sorry noch nie gehört? Zugriff hab ich volle Rechte.

Diese Daten werden stündlich aktualisiert, leider braucht das Update knapp über 1h ca. Ich muss es schneller erledigen könnnen. Problem ist, dass es über eine externe DB geht, diese hat keine externen Zugriffe erlaubt daher muss ich dort mit einem PHP Script arbeiten. Am PHPScript liegt es aber nicht.
 
Derzeit mache ich es so, ich habe eine List mit allen Auto-Objekten (10.000+) aus einer Datei gelesen.

Sprich du hast die Autos und deren IDs zur Verfügung. Sprich du brauchst doch keine extra SELECTs ausführen bzw. SELECT im UPDATE einbauen.
Damit würdest du unnötigerweise etwas verkomplizieren.

...... in dieser Methode muss ich 5 Tabellen mit den Daten aus Autoobjekt füllen, also habe ich 5 Statements

Geht es hier dann um INSERTS oder UPDATES?
Bei INSERTs wäre eine Möglichkeit per INSERT gleich mehere Datensätze einzutragen (sprich immer 100 Autos oder so mit einem Statement einzutragen).
Bei UPDATEs könntest du mal schauen ob du etwas zu PHP mit BULK Operationen findest.

vor dem INSERT seicher in einer Variable die autiID damit ich da schon mal nicht jedes mal abfragen muss

Wie oben schon geschrieben wenn du die Auto Objekte hast sollten die IDs schon dabei sein. Ohne würde man gar nicht sicher gehen können das wirklich dieses oder jenes Auto gemeint ist 😉
Sollte die ID nicht dabei sein (warum auch immer), wäre eine Möglichkeit diese in der Datei schon mitlieferen zu lassen (damit ersparst du dir schon mal die SELECTs für die ID).
Oder anstatt für jedes Auto einzeln abzufragen Frage alle IDs von Autos ab und gehe die Liste durch und ergänze bei jedem Auto die passende ID (somit musst du nur 1 SELECT machen statt 10.000+)
 

Zurück
Oben