![]() |
Datenbank: Pervasive • Version: egal • Zugriff über: egal
Konzeptfrage zu SQL: in Schleife(?) auf Bedingung prüfen
Hallo zusammen,
ich muss eine Anforderung umsetzen und suche nun eine passende "Strategie". Gegeben: 1 größere Tabelle, eine Textdatei mit ca. 200 - 3000 Rec-ID-Nummern. Die Tabelle hat momentan ca. 600 000 Datensätze, täglich wachsend. Nun soll in dieser Tabelle in allen Datensätzen welche einer der Rec-Id's (Identifikation) aus der Textdatei entsprechen, ein bestimmtes Feld gesetzt werden. Im ersten Ansatz würde ich mir die Textdatei mit den Identifikations-Nummern in eine StringList laden. Dann in einer Schleife durchlaufen lassen. Pseudo-Code:
Delphi-Quellcode:
Ich habe das jetzt nicht getestet und habe auch keine Vorstellung wie performant das Ganze ist und ob es so überhaupt sinnvoll ist.
begin
Qry_Update.SQL.add(UPDATE MEINETABELLE set MEINETABELLE.UpdateFeld = '8' where MEINETABELLE.Identifikation = ); begin Sl_sql := TStringList.Create; Sl_sql.LoadFromFile(...); for I := 0 to Sl_sql.Count - 1 do begin if I <> Sl_sql.Count - 1 then begin Qry_Update.SQL.add('Sl_sql[i] or MEINETABELLE.Identifikation = ') end else Qry_Update.SQL.add('Sl_sql[i]') end; end; end; Kennt jemand bessere Konzepte für solche Anforderungen oder sollte ich das so umsetzen? Vielen Dank schon mal vorab für eure Unterstützung! |
AW: Konzeptfrage zu SQL: in Schleife(?) auf Bedingung prüfen
Importiere die Liste mit den IDs in die Datenbank. Nennen wir diese Tabelle 'IDTabelle'. Dann erstellst Du einen Index auf die Spalte. Nun führst Du einfach einen SQL-Befehl aus:
Code:
Anschließend löschst Du die Tabelle wieder. Der Import der Textdatei sollte sehr schnell mit BDU.EXE möglich sein, welches ab v9 mitgeliefert wird.
update Tabelle Set Feld=1
where ID in (select * from IDTabelle) |
AW: Konzeptfrage zu SQL: in Schleife(?) auf Bedingung prüfen
Ich würde dazu die IN-Klausel nützen:
SQL-Code:
Schreib dir eine Funktion, die immer 50 Werte aus der Stringliste mit REC-ID-Nummern entnimmt (und auch gleich aus der Stringliste entfernt).
UPDATE MEINETABELLE set MEINETABELLE.UpdateFeld = '8' where MEINETABELLE.Identifikation IN (4711,4712,4713,4714)
Du kannst nicht alle 2000-3000 Werte in die IN-Klausel packen, weil dann bestimmte Limits wie z.B. max Länge einer SQL-Anweisung übrschritten würden. |
AW: Konzeptfrage zu SQL: in Schleife(?) auf Bedingung prüfen
Bei 200-3000 IDs könnte das wirklich schneller sein.. ich kann mir vorstellen, das Pervasive mit durchaus 100 IDs in der IN-Liste klar kommt. Dann wären das 2-30 statements...
|
AW: Konzeptfrage zu SQL: in Schleife(?) auf Bedingung prüfen
@Furtbichler,
oh da staune ich, du kennst das Pervasive BDU-Tool, da höre ich heute zum ersten Mal von. :-D. Laut Pervasive-Hilfe scheint das Tool ja schön simpel zu sein. Gut zu wissen... Vielen Dank für deinen wirklich interessanten Tipp und Ansatz mit der 2.Tabelle! :thumb: @sx2008, vielen Dank auch für deinen Tipp! :thumb: Dein Ansatz könnte ich wohl relativ schnell umsetzen, aber irgendwie reizt mich jetzt der Ansatz von Furtbichler Euch einen schönen Abend! :dp: |
AW: Konzeptfrage zu SQL: in Schleife(?) auf Bedingung prüfen
Ich habe das ganze nun direkt mit 3000(!) 8-stelligen Rec-Id's in einem SQL-Statement über die IN Bedingung ausgeführt. Das funktioniert! Dauert ca. 1,5 Sekunden. Danach habe ich es wiederholt mit 6 stelligen Rec-Id's, da sah ich auch das Ergebnis (meine Test-Tabelle hat ja nur 600 000 Datensätze).
Was meint ihr, sollte ich das trotzdem "aufbröseln" in kleine Häppchen, also in mehrere SQL-Statements? Ich finde in der Hilfe keine Limitierungen. |
AW: Konzeptfrage zu SQL: in Schleife(?) auf Bedingung prüfen
Zitat:
Datei in Tabelle einlesen. Update ausführen Tabelle leeren Unter Oracle machen wir das immer so: Batch-/Shellscript mit (ggfls. per Taskplaner...) Datei(en) woher auch immer per FTP... holen (wenn erforderlich) SQLLoader zum Befüllen (temporärer) Tabelle(n) SQLPLus mit Datenbankscript zur Verarbeitung der soeben geladenen Daten incl. aufräumen der (temporären) Tabellen verarbeitete Datei(en) sichern oder entsorgen, je nach Aufgabenstellung Wir machen möglichst viele Aufgaben direkt in der Datenbank, da dies gewöhnlich deutlich schneller ist, als über Programme. |
AW: Konzeptfrage zu SQL: in Schleife(?) auf Bedingung prüfen
Zitat:
Als Übung wäre es jedoch eine gute Sache. Es ist immer praktisch, ein Bulk Insert Tool im Schrank zu haben. |
AW: Konzeptfrage zu SQL: in Schleife(?) auf Bedingung prüfen
Liegen die Daten als Import vor, wäre das Stichwort 'korreliertes Update'
Code:
Dieses Verfahren dürfte in keinem etablierten RDBMS zu einer Verletzung von Limitierungen führen. Dieses Verfahren lässt sich auch einfach erweitern, wenn es mehrere Kriterien für den eigentlichen Abgleich gibt. 'Where In ()' ist da je nach System nicht so flexibel.
UPDATE <Tabelle | View>
SET <Name einer Spalte> = <Ausdruck aus Spalten, Konstanten, Funktionen> [, weitere Spaltennamen = Ausdruck] [FROM <Tabelle> [INNER | LEFT | RIGHT] JOIN <Tabelle> ON <Spalte-1 = Spalte-2>] WHERE <Bedingung> Bleibt als fragwürdige Hürde nur der Kodierungs-Aufwand für den Import. Vom Performancespekt her ist die Import/korreliertes Update Lösung garantiert unschlagbar. Wenn es um große Datenmengen geht, setzen wir bspw. vor den Import ein gezipptes Upload. Je nach Importverfahren /-fähigkeiten der DB ist nicht mal ein wirklicher Import notwendig (Stichwort 'external tables'). Man müllt sich die DB nicht zu und muss nichts anlegen/löschen. Die original csv-Dateien können bei Bedarf zu dokumentarischen Zwecken (gezippt) auf dem Serverfilesystem verbleiben. |
AW: Konzeptfrage zu SQL: in Schleife(?) auf Bedingung prüfen
@nahpets,
Zitat:
1. maximale Anzahl der Übergabewerte in der IN() Bedingung (momentan habe ich beim Kunden 1000 eingestellt und das lief heute beim Kunden schon mal problemlos) 2. Die eigentlichen ID's für die IN() Bedingung Nach diesem Wochenende (Stichwort Borussia :wink:) werde ich auf jeden Fall noch die "bessere" Variante von Furtbichler umsetzen. Schon allein um zu wissen wie das Pervasive eigene BDU-Tool arbeitet. Zitat:
@by jobo, danke auch für deinen Tipp! :) Auf den ersten Blick sieht das für mich nach dem aus, was Furtbichler in Post#2 vorgeschlagen, oder? Ich bin nun froh dass ich meine Frage hier gestellt hatte, da ich hier 2 interessante neue Ansätze erhalten habe. Vielen Dank dafür! :dp: .. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 02:44 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz